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; }