如何在继续执行之前确保完成asynchronous操作

我正在构build一个iOS应用程序,其代码的一部分依赖于从特定任务返回的成功/失败值。这些任务涉及来自库的callback。 我希望这个任务的返回值只有在callback函数返回成功/失败之后才能被返回。 但是因为我写了一个顺序代码,所以即使在callback返回成功/失败之前,也会返回返回值。

我看着使用模式视图控制器,并从我的理解,我可以使任务从这个视图控制器执行,然后返回代码。

但是这也不符合我的要求,因为启动callback序列的代码被执行时,我不希望显示一个新的视图控制器。 虽然有一定的callback,需要我提示用户提供信息。 我在popover中做这个,我考虑在popover模式中做视图控制器。 但是,callback将仍然是主线程的一部分,我不会收到他们当我的popover模态(?)。

以我目前对这些概念的理解,我不知道如何继续。 有没有办法在iOS中做到这一点?

编辑:代码做这样的事情

//In CustomTableViewController -(void) someFunc { ENUM_NAME code = [TaskController startTheTask:args]; if(code == SUCCEEDED) { //Do Something } if(code == FAILED) { //Do Something Else } } //In TaskController -(ENUM_NAME) startTheTask:args { startWorkflow(args); //This function registers callback function with the library. return finalCode; //This is returned even before it is set to SUCCEEDED/FAILED } -(void) onCallback:params { MSG_TYPE msg = [params getMsg]; if(msg == TASK_FAILED) finalCode = FAILED; if(msg == TASK_SUCCEEDED) finalCode = SUCCEEDED; if(msg == TASK_SHOW_PROMPT) { [PopOverController showPopOver]; } } -(void) onUserInfoAdded { //This is called when Confirm is clicked in the popover continueWorkflow(params); //asks for the next callback to happen } -(void) onCancleClicked { //This is called when Popover is dismissed without entering Info cancleWorkflow(params); //asks for result of the workflow through callback } 

你可以使用GCD。 例如:

  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); dispatch_group_async(group, queue, ^{ //put one process here dispatch_group_leave(group); //when done }); dispatch_group_enter(group); dispatch_group_async(group, queue, ^{ //put another process here dispatch_group_leave(group); //when done }); // All updates finished dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // add last steps here after all processess are finished }); dispatch_release(group); 

您可以使用信号量来延迟执行,直到块返回:

 __block dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); __block NSData *dataFromTheBlock = nil; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // block implementation // dataFromTheBlock = some data; dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);