簡體   English   中英

如何將數據從異步任務傳遞到視圖控制器?

[英]How do I pass data from an asynchronous task to a view controller?

摘要

我在異步任務中使用用戶的登錄用戶名和密碼查詢用戶的API。 我找到了一種方法:

  1. 在與我的UIViewController相同的文件中創建協議委托。
  2. 使協議委托UIViewController的成員。
  3. 創建用於執行異步的API類。 任務。
  4. 定義UIViewController的委托成員變量的完成處理函數。
  5. 將URL,委托,參數等傳遞給API類。
  6. 執行異步。 API類中的任務。
  7. 一旦異步。 任務完成后,完成處理程序在原始視圖控制器中執行。

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")
            }
        }
    }
}

查看控制器文件

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?

基本上你的代碼應該工作,但我強烈建議使用回調閉包而不是協議/委托。

代碼使用枚舉來返回單個值和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"))
                }
        }
    }
}

您可以通過關閉傳遞數據

聲明阻止

typealias responseHandler = (_ responseObject: [String : Any]) -> Void

 func getPOSTData(with callback : responseHandler){
        API.request(URL, method: .post).responseJSON
            { response in
                if response.result.value != nil {
                    //print("JSON: \(JSON)")
                    self.delegate?.onSuccess(jsonData: JSON as! [String : Any])
                    callback(JSON as! [String : Any])

                } else {
                    callback([:] as! [String : Any] )
                }
        }
    }

調用如下

client.getPOSTData { (responseData) in
            print(responseData)
            // here your data
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM