[英]How Do I Pass Data from Third View Controller Back to First View Controller?
[英]How do I pass data from an asynchronous task to a view controller?
摘要
我在異步任務中使用用戶的登錄用戶名和密碼查詢用戶的API。 我找到了一種方法:
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.