SWift3.0中網(wǎng)絡(luò)請(qǐng)求一般是使用Alamofire框架。
簡(jiǎn)單get和post網(wǎng)絡(luò)請(qǐng)求封裝药薯。
類(lèi)名命名為ZWNetworkTools。注意使用cocoapod要導(dǎo)入頭文件救斑,這是因?yàn)槊臻g的緣故童本。
import UIKit
import Alamofire
enum MethodType {
case get
case post
}
class NetworkTools: NSObject {
//參數(shù)別人可能傳也可能不傳,所以用可選脸候?
class func requestData(type: MethodType, URLString: String,parameters: [String : Any]? = nil, finishedCallback: @escaping (_ result: Any) -> ()){
let method = type == .get ? HTTPMethod.get : HTTPMethod.post
Alamofire.request(URLString, method: method, parameters: parameters).responseJSON { (response) in
guard let result = response.result.value else{
//這里出現(xiàn)錯(cuò)誤
print(response.result.error ?? "")
return
}
finishedCallback(result)
}
}
}
網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)解析細(xì)節(jié)
NetworkTools.requestData(type: .get, URLString: "http://capi.douyucdn.cn/api/v1/getHotCate", parameters: parameters) { (result) in
//print(result)
//因?yàn)榭蛇x項(xiàng)不能參與計(jì)算穷娱,所以要guard let
//其實(shí)只要理解?是定義時(shí)使用运沦,泵额!是在計(jì)算之前的準(zhǔn)備就可以。
//1茶袒、result原本是Any類(lèi)型,一般直接轉(zhuǎn)為字典凉馆,并且還要守護(hù)薪寓,因?yàn)榭赡苻D(zhuǎn)化字典無(wú)法成功。
guard let resultDict = result as? [String: NSObject] else{return}
//2澜共、根據(jù)data的key,獲取字典數(shù)組
guard let dataArray = resultDict["data"] as? [[String: NSObject]] else {return}
//3向叉、遍歷數(shù)組,獲取字典嗦董,并且將字典轉(zhuǎn)為模型對(duì)象
//目前swift中還沒(méi)有比較好的第三方字典轉(zhuǎn)模型框架
for dict in dataArray{
//這里涉及計(jì)算母谎,所以上面直接守護(hù)了dataArray
let group = AmchorGroup(dict: dict)
self.anchorGroup.append(group)
}
for group in self.anchorGroup{
print(group.tag_name)
}
dGroup.leave()
}
模型的實(shí)現(xiàn)【└铮可以參考第16節(jié)奇唤。
class AmchorGroup: NSObject {
//給基本數(shù)據(jù)類(lèi)型初始化
//使用KVC會(huì)提示無(wú)法找到age的KEY,因?yàn)镮nt是一個(gè)基本數(shù)據(jù)類(lèi)型的結(jié)構(gòu)體匹摇,OC中只有基本數(shù)據(jù)類(lèi)型咬扇。因此對(duì)于基本數(shù)據(jù)類(lèi)型要設(shè)置初始值。
//var age: Int = 0
//該組中對(duì)應(yīng)的房間信息
var room_list : [[String : NSObject]]?
var tag_name: String = ""
var icon_name: String = ""
//這里涉及計(jì)算廊勃,所以就不要設(shè)置為可選了 對(duì)外提供的參數(shù)之間為不可選的
init(dict: [String: NSObject]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
}
同一頁(yè)面多個(gè)網(wǎng)絡(luò)請(qǐng)求的處理
func requestData(finishedCallBack: @escaping () -> ()){
let parameters = ["limit" : "4", "offset" : "0", "time" : NSDate.getCurrentTime()]
let dGroup = DispatchGroup()
//1懈贺、請(qǐng)求推薦數(shù)據(jù)
dGroup.enter()
NetworkTools.requestData(type: .get, URLString: "http://capi.douyucdn.cn/api/v1/getbigDataRoom", parameters: ["time" : NSDate.getCurrentTime()]) { (result) in
//print(result)
dGroup.leave()
}
//2、請(qǐng)求顏值數(shù)據(jù)
dGroup.enter()
NetworkTools.requestData(type: .get, URLString: "http://capi.douyucdn.cn/api/v1/getVerticalRoom", parameters: parameters) { (result) in
dGroup.leave()
}
//3、請(qǐng)求后面部分的游戲數(shù)據(jù)
dGroup.enter()
NetworkTools.requestData(type: .get, URLString: "http://capi.douyucdn.cn/api/v1/getHotCate", parameters: parameters) { (result) in
dGroup.leave()
}
dGroup.notify(queue: DispatchQueue.main) {
//上面三分每次請(qǐng)求的網(wǎng)絡(luò)數(shù)據(jù)可以分別用一個(gè)數(shù)組去記錄梭灿。三個(gè)網(wǎng)絡(luò)數(shù)據(jù)都請(qǐng)求成功后画侣,可以將網(wǎng)絡(luò)數(shù)據(jù)在這里面拼接
finishedCallBack()
}
}