美文网首页小斑Swift_VIP专场汇总程序员
OC转swift3.0 实践 (四)网络层实操

OC转swift3.0 实践 (四)网络层实操

作者: APP叫我取个帅气的昵称 | 来源:发表于2016-12-08 09:33 被阅读548次

今天接上篇文章OC转swift3.0实战 (三)网络层初探,废话不多说,直接干。
先看下接口返回的整体数据,

整体结构.png

现在我要拿到focusImages字典下的pic

接口返回的数据.png

一.类似的,学OC封装下网络请求的工具

详细的见本人的另一篇文章Swift3.0系列之基于Alamofire4.0网络层封装

二.新建一个swift文件,将所有的API请求写在该文件下

import UIKit

let saleAPI = "xxxxxxxxxxx?channel=ios-b1&device=iPhone&includeActivity=true&includeSpecial=true&scale=2&version=5.4.21"
class ZLMSaleAPI: NSObject {
    
    class func requestSaleData(_ finished:@escaping (_ result:AnyObject? ,_ error:NSError?)->()){
        
        NetworkTools.shareInstance.requestData(methodType: .GET, urlStr: saleAPI, parameters: nil){
        (result,error)in
            finished(result,error)
        }
        
    }
}

三.这里建model不多说(我只取自己要的字段),两个model

import UIKit
import HandyJSON
struct ZLMSaleColumns: HandyJSON {
    var code: Int?
    var codeMessage: String?
    var type: String?
    var list:[ZLMSaleModel]?
    required init(){}
}

图片数组的model

import UIKit
import HandyJSON
struct ZLMSaleModel: HandyJSON {
    var pic :String?
    required init(){}
}

从上看出通过HandyJSON建立的model有个固定格式

import UIKit
import HandyJSON
struct model名:HandyJSON{
      ....
    你所需要的字段
      ....
required init(){}
}

四.最后一步在controller里的事

1.先导入两个库

import SwiftyJSON
import HandyJSON

2.新建两个model的对象

 var focusImagesColumns:ZLMSaleColumns!
    
 var listArr:Array<ZLMSaleModel?> = []{ didSet { setDataSource() } }

setDataSource()函数

  func setDataSource() {
        tableview.reloadData()
    }

3.在生命周期viewDidLoad()中调用获取Data数据的函数

  override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        self.automaticallyAdjustsScrollViewInsets = true
        self.view.addSubview(tableview)
        refreshData()//获取数据
    }

refreshData()函数的实现

 func refreshData()  {
        ZLMSaleAPI.requestSaleData{[unowned self](result,error) in
            if error != nil{
                print(error as Any)//暂时做打印处理
            }else{
                let json = JSON(result as Any)//SwiftyJSON将获取到的数据解析成json
                let focusImagesColumns = JSONDeserializer<ZLMSaleColumns>.deserializeFrom(json:json["focusImages"].description)//HandyJSON将其映射到BaseModel中去
                self.focusImagesColumns = focusImagesColumns
                let listArray = self.focusImagesColumns.list
                self.listArr = listArray!//将focusImages下的list映射到pic所在的model中
            }
            
        }
    }

以上。

相关文章

网友评论

  • a1ca31b58342:Swift 3主推值struct ,首先来说更安全,如果你的类不需要引用语义,继承,还是struct更好一些
    a1ca31b58342:@APP叫我取个帅气的昵称 很多地方怪怪的,希望楼主能好好体会一下……
    APP叫我取个帅气的昵称:@JngViho 嗯,好的
  • Misaki_yuyi:有个疑问 基本上一个VC会有两个model 一个是基本的BaseModel 一个是由BaseModel组成的list Model? 这样不是很繁琐么~ 求解答
    APP叫我取个帅气的昵称:@Misaki_yuyi 好吧 恕我直言,要么是有特殊需求,要么就是写API那位写的是假API:innocent:
    Misaki_yuyi:@APP叫我取个帅气的昵称 嗯 项目结构不太一样 我的项目 每一个不同的VC都有不同的BaseModel 不太好共用
    APP叫我取个帅气的昵称:@Misaki_yuyi Basemodel 是个通用model ,将所有model 的公有部分提取出来,这样不用写重复代码,相当于封装一个model ,不仅在这个VC 上能用到,还可以在其他VC 上用到哦:smile:

本文标题:OC转swift3.0 实践 (四)网络层实操

本文链接:https://www.haomeiwen.com/subject/etsjmttx.html