专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
实现StatusDAL中的loadStatus
实现
HMStatusDAL.swift中的loadStatus方法// 加载微博数据 func loadStatus(since_id: Int, max_id: Int, finish: @escaping ([[String: Any]]?, Error?) -> Void) { // 1.查看本地是否有缓存数据 loadCacheData(since_id: since_id, max_id: max_id) { (array) in // 2.如果本地有数据,直接返回给调用者 if let array = array, array.count > 0 { print("本地加载 \(array.count)") finish(array, nil) return } print("网络加载") // 3.如果没有缓存数据,去网络加载数据 // 判断accessToken是否为空 guard let access_token = HMUserAccountViewModel.shared.userAccount?.access_token else { // accessToken为空 return } // url let urlString = "2/statuses/home_timeline.json" // 参数 var parameters: [String: Any] = ["access_token": access_token] // , "count": 1 if since_id > 0 { parameters["since_id"] = since_id } else if max_id > 0 { // 别人传递了max_id.添加到字典里面 parameters["max_id"] = max_id - 1 } HMNetworkTool.shared.request(method: .GET, URLString: urlString, parameters: parameters, progress: nil, success: { (_, result) in // 获取返回数据中的微博数据 if let dict = result as? [String: Any], let array = dict["statuses"] as? [[String: Any]] { // 4.缓存网络加载的数据到本地数据库 self.saveStatus(array: array) // 5.返回数据给调用者 finish(array, nil) } }, failure: { (_, error) in // 5.返回数据给调用者 finish(nil, error) }) } }修改
HMStatusListViewModel.swift中的loadStatus方法- 调用
HMStatusDAL的loadStatus方法 闭包返回参数修改
/** 加载微博数据 */ func loadStatus(since_id: Int, max_id: Int, completion: @escaping ([HMStatusViewModel]?, Error?) -> Void) { if isLoadingStatus { let error = NSError(domain: "cn.itheima.com", code: -1, userInfo: ["原因" : "同时加载数据了"]) completion(nil, error) return } isLoadingStatus = true HMStatusDAL.shared.loadStatus(since_id: since_id, max_id: max_id) { (array, error) in // 从网络加载微博数据完成 self.isLoadingStatus = false if error != nil { print("出错了 \(error)") completion(nil, error) return } DispatchQueue.global().async(execute: { // 定义空数组保存模型数据 var statusVMs = [HMStatusViewModel]() // 1遍历数组字典转模型 for dict in array! { let status = HMStatus(dict: dict) let statusVM = HMStatusViewModel(status: status) statusVMs.append(statusVM) } DispatchQueue.main.async(execute: { completion(statusVMs, nil) }) }) } }
- 调用
打断点测试
