2014-04-17 88 views
0

我正在构建一个iOS应用程序,其代码的某些部分依赖于从特定任务返回的成功/失败值。此任务涉及来自库的回调。我希望只有在回调函数返回成功/失败后才能返回此任务的返回值。但是,由于我编写了一个顺序代码,所以即使在回调返回成功/失败之前,也会返回返回值。如何确保在继续执行之前完成异步操作

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

但是,这也不符合我的要求,因为当启动回调序列的代码被执行时,我不希望显示新的视图控制器。虽然有一定的回调需要我提示用户提供信息。我在popover中做了这个,我考虑在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 
} 
+0

你可以使用将被触发,一旦您的异步方法完成委托的方法。 – Larme

+0

请添加一些代码 – suhit

回答

1

您可以使用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); 
-1

您可以使用一个信号延迟执行,直到块回报:

__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); 
+0

谢谢你的回答。关于我发布的代码,“TaskController”中的所有函数是否应该成为此块的一部分?如果没有'onCallback'函数作为这个块的一部分,有没有其他方法可以获得回调? – itsmeIcarus

+0

这不是必须的。关键是你可以用'dispatch_semaphore_wait(信号量,DISPATCH_TIME_FOREVER)'阻塞当前线程;'当你调用'dispatch_semaphore_signal(信号量);'时继续执行。当然,这两个调用不能在同一个线程中,因为它会无限期地阻塞该线程。 – Levi

+0

阻止线程获取异步任务的结果并在结果最终可用后继续执行程序没有意义。其实,这是一种代码味道。你可以看看朱莉的答案,这是一个合理的方法。 – CouchDeveloper

相关问题