专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
HMUserAccountViewModel加载AccessToken后回调
- 当
HMUserAccountViewModel
的loadAccessToken
将HMUserAccount
保存到沙盒后,控制器并不知道加载AccessToken
的结果.需要通过闭包回调 给
HMUserAccountViewModel
的loadAccessToken
添加completion: (Error?) -> Void
闭包// MARK: - 加载Access Token func loadAccessToken(code: String, completion: @escaping (Error?) -> Void) { ... HMNetworkTool.shared.request(method: HMNetworkMethod.POST, URLString: urlString, parameters: parameters, progress: nil, success: { (_, result) in print("result = \(result)") let dict = result as! [String: Any] // 字典转模型 self.userAccount = HMUserAccount(dict: dict) print("userAccount = \(self.userAccount)") self.saveUserAccount() // 调用闭包,完成accessToken加载和保存 completion(nil) }) { (_, error) in // 调用闭包,加载accessToken出错了 completion(error) } }
在
HMOauthViewController
调用HMUserAccountViewModel
的loadAccessToken
方法时,准备闭包// 判断后面是否跟有参数 if let query = request.url!.query { let nsQuery = query as NSString let codeString = "code=" // 判断query里面是否包含code=字符串 if nsQuery.hasPrefix(codeString) { let code = nsQuery.substring(from: codeString.characters.count) print("拦截到code = \(code)") HMUserAccountViewModel.shared.loadAccessToken(code: code, completion: { (error: Error?) in if error != nil { print("加载accessToken出错: \(error)") SVProgressHUD.showError(withStatus: "您的网络不给力") DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: { // 关闭授权控制器 self.close() }) return } // 直接关闭控制器 print("加载accessToken完成") self.close() }) } else { //点击取消 close() } }