ios - 如何将数据从异步任务传递到 View Controller ?

标签 ios swift asynchronous

摘要

我正在异步任务中使用用户的登录用户名和密码查询 API。我找到了一种方法:

  1. 在与我的 UIViewController 相同的文件中创建协议(protocol)委托(delegate)。
  2. 使协议(protocol)委托(delegate)成为 UIViewController 的成员。
  3. 创建一个用于执行异步的 API 类。任务。
  4. 定义 UIViewController 的 delegate 成员变量的完成处理函数。
  5. 将 URL、委托(delegate)、参数等传递给 API 类。
  6. 执行异步。 API 类中的任务。
  7. 一旦异步。任务完成后,完成处理程序将在原始 View Controller 中执行。

API文件

class API {
    var delegate: APIDelegate?
    required init(providedDelegate: APIDelegate){
        delegate = providedDelegate
    }
    func getPOSTData(){
        API.request(URL, method: .post).responseJSON
        { response in
            if response.result.value != nil {
                //print("JSON: \(JSON)")
                self.delegate?.onSuccess(jsonData: JSON as! [String : Any])
            } else {
                self.delegate?.onFailure(error: "No JSON Data")
            }
        }
    }
}

查看 Controller 文件

protocol APIDelegate{
    func onSuccess(jsonData: [String:Any])
    func onFailure(error: Any)
}
UIViewControllerName : UIViewController, APIDelegate{
    var delegate: APIDelegate?

    func testAPICall(sender: UIButton){
        let client = API(providedDelegate: delegate!)
        client.getPOSTData()
    }

    func onSuccess(jsonData: [String:Any]) {
        print("JSON: \(jsonData)")
    }
    func onFailure(error: Any) {
        print(error)
    }

}

问题

从长远来看,这会导致问题吗?是否有更好的方法在异步任务之间共享数据(从另一个类返回到调用 UIViewController)?

最佳答案

基本上你的代码应该可以工作,但是我强烈建议使用回调闭包而不是协议(protocol)/委托(delegate)。

代码使用枚举能够返回单个值,并使用 switch 语句来处理调用方的情况:

enum APIResult {
    case success([String:Any])
    case failure(Any)
}

class UIViewControllerName : UIViewController {

    func testAPICall(sender: UIButton) {

        let client = API()
        client.getPOSTData() { result in
            switch result {
               case .success(let jsonData) :  print("JSON: \(jsonData)")
               case .failure(let error) :  print("JSON: \(error)")
            }
        }
    }
}


class API {

    func getPOSTData(completion: (APIResult)->() ) {
        API.request(URL, method: .post).responseJSON
            { response in
                if response.result.value != nil {
                    //print("JSON: \(JSON)")
                    completion(.success(JSON as! [String : Any]))
                } else {
                    completion(.failure("No JSON Data"))
                }
        }
    }
}

关于ios - 如何将数据从异步任务传递到 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346538/

相关文章:

ios - Swift 项目中缺少所需的架构 x86_64 错误?

ios - 确定图像选择器媒体类型是视频还是照片

ios - Swift StoryBoard Reference segue 到 Navigation controller 而不是 Root

c# - 使用服务引用时无法将 IAsyncResult 转换为 AsyncResult

c# - ontextchanged 异步 sql 存储过程调用

ios - 在 iOS 中更新 TwitterKit SDK

iphone - 如何检测用户是否直接单击 cell.imageView 而不是 tableview 单元格中的标签?

java - RxJava 2 : Observable. create() 等待异步代码使用 Thread.sleep() 完成

ios - MFMailComposeViewController 在 iOS 8 Xcode 6 中不可编辑

ios - Swift:如何从字符的开始到最后一个索引获取子字符串