swift:asynchronous任务+完成

我很快就对asynchronous任务感到困惑。 我想要做的是这样的事情…

func buttonPressed(button: UIButton) { // display an "animation" tell the user that it is calculating (do not want to freeze the screen // do some calculations (take very long time) at the background // the calculations result are needed to update the UI } 

我试图做这样的事情:

 func buttonPressed(button: UIButton) { let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_async(queue) { () -> Void in // display the animation of "updating" // do the math here dispatch_async(dispatch_get_main_queue(), { // update the UI } } } 

但是,我发现UI更新没有等待我的计算完成。 我对使用asynchronous队列很困惑。 任何人帮助? 谢谢。

您需要一个具有asynchronous完成处理程序的函数。

在计算结束时调用completion()

 func doLongCalculation(completion: () -> ()) { // do something which takes a long time completion() } 

buttonPressed函数中,在后台线程上分派计算函数,并在完成后返回主线程来更新UI

 func buttonPressed(button: UIButton) { // display the animation of "updating" dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { self.doLongCalculation { dispatch_async(dispatch_get_main_queue()) { // update the UI print("completed") } } } } 
 dispatch_queue_t dispatchqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(dispatchqueue, ^(void){ while ([self calculate]) { NSLog(@"calculation finished"); dispatch_async(dispatch_get_main_queue(), ^{ // update the UI }); } }); - (BOOL)calculate { //do calculation //return true or false based on calculation success or failure return true; }