赞
踩
Swift DataProvider NetworkDataProvider
从服务器接收数据,保存到model里
第一步:在DataProvider里添加这个方法
protocol DataProvider {
func collectData(_ completionHandler: CompletionHandler?)
}
第二步:在NetworkDataProvider里添加这个方法
final class NetworkDataProvider: DataProvider {
func collectData(_ completionHandler: CompletionHandler?) {
self.processRequest(CollectDataRequest(), completionHandler)
}
}
第三步:在Requset里添加这个class
class CollectDataRequest: JsonRequest<CollectData> {
init() {
super.init(method: .get, urlPath: "(服务器的网址)")
}
override func needsAccessToken() -> Bool {
return false
}
}
第四步:在Model里添加这个class
class CollectData: Codable {
public var notes: [CollectNote] = []
public var stat: HomeCount
private enum CodingKeys: String, CodingKey {
case notes
case stat
}
required public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.notes = try container.decode(.notes)
self.stat = try container.decode(.stat)
}
}
第五步:在NetworkDataProvider里添加这个两个方法
// MARK: - Private methods
private func processRequest(_ request: BaseRequest,_ completionHandler: CompletionHandler?) -> Void {
self.executeRequest(request, completionHandler)
}
private func executeRequest(_ request: BaseRequest,_ completionHandler: CompletionHandler?) -> Void {
NetworkProvider.shared.sendRequest(request) {(_ data: Any, _ error: Error?) in
completionHandler?(data, error)
}
}
第六步:在NetworkDataProvider里添加这个方法
func sendRequest(_ baseRequest: BaseRequest, _ completionHandler: CompletionHandler?) -> Void { //Send the request self.alamofireManager?.request(baseRequest).validate().responseJSON { response in switch response.result { case .success: if let json = response.result.value { print(json) guard let completionHandler = completionHandler else { return } guard let res = response.data else { return } guard let jsonResponse = try? JSON(data: res) else { return } if jsonResponse["success"].boolValue { let data = try? jsonResponse["data"].rawData() let allData = try? jsonResponse.rawData() let responseData = baseRequest.parseNetworkResponse(data ?? allData ?? Data()) completionHandler(responseData, nil) } else { completionHandler(nil, MyError(message: jsonResponse["message"].stringValue)) } } case .failure: if response.error.debugDescription.contains("\(NSURLErrorTimedOut)") || response.error.debugDescription.contains("\(NSURLErrorNotConnectedToInternet)") { DispatchQueue.main.async { H.error(H.t("no_network.title"), cancelTitle: H.t("common.cancel"), confirmTitle: H.t("no_network.open_setting")) { guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return } UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil) } } } break } } }
第七步:到这里网络配置就告一段落了,下面就是调用了,在你需要用的页面进行一个方法的调用
func loadData() {
DataManager.dataProvider.collectData() { (data, error) in
if let error = error as? MyError {
H.error(error.message)
return
}
if let countsData = data as? CollectData {
self.counts = countsData.stat
self.searchSection.setData(homeCount: self.counts ?? HomeCount())
self.vTable.reloadData()
}
}
}
第八步:我们来看看保存下来的数据
这里我们可以看到,我们之前服务器返回的数据是这个:
在这里我们就能看到,服务器返回的数据和我们这里获取到的数据是一样的,这样我们就可以存储这些数据用于显示等各种用途了:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。