-1

我来自C#背景,希望在我的Swift应用程序中实现等待功能。我已经达到了我想要的结果,但是我不得不使用信号量,我不确定这是一种好的做法。我有一个函数与alamo请求,返回一个JSON的成功值,据我所知,请求函数是一个完成处理程序异步。处理程序在请求完成后触发。问题是从该操作返回成功值。下面是我正在做的一个伪代码示例:“等待”Swift中的任务结果

func AlamoTest() -> Bool{ 
var success = false 
//Do some things... 
//... 
//Signal from async code 
let semaphore = DispatchSemaphore(value: 0) 
Alamofire.request("blah blah blah", method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in { 
    success = response["success"] 
    if(success){ 
     //Do some more things 
    } 
    semaphore.signal() //Signal async code is done 
} 
//Wait until async code done to get result 
semaphore.wait(timeout: DispatchTime.distantFuture) 
return success 
} 

有没有一种“更好”的方式来实现我的目标?我是Swift及其异步构造的新手。

+0

反对吗?真的吗? – Seapoe

回答

0

我发现的最佳解决方案就是我所说的“回调链接”。我的方法的例子是这样的:

func postJSON(json: NSDictionary, function: ServerFunction, completionHandler: ((_ jsonResponse: NSDictionary) -> Void)? = nil) { 
    //Create json payload from dictionary object 
    guard let payload = serializeJSON(json: json) else { 
     print("Error creating json from json parameter") 
     return 
    } 

    //Send request 
    Alamofire.request(urlTemplate(function.rawValue), method: .post, parameters: payload, encoding: URLEncoding.default).validate().responseJSON { response in 
     //Check response from server 
     switch response.result { 
      case .success(let data): 
       let jsonResponse = data as! NSDictionary 
       print("\(jsonResponse)") 
       //Execute callback post request handler 
       if completionHandler != nil { 
        completionHandler!(jsonResponse) 
       } 
      case .failure(let error): 
        print("Shit didn't work!\(error)") 
      } 
    } 
} 

最后一个参数是执行,一旦原单异步操作完成封闭。您将结果传递给关闭,并按照您的要求进行操作。在我的情况下,我想在异步操作滚动时禁用视图。您可以在闭合参数中启用视图,因为在主线程上调用了alamo异步操作的结果。如果您不需要结果并停止链接,completionHandler默认为nil。

+0

https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f –