如何在循环中同步回调函数

时间:2011-08-21 14:34:47

标签: iphone objective-c

我对iPhone开发很新。我需要一些关于如何同步回调方法和for循环的帮助。

例如: 我有一个for循环说1到3。

在此循环中,首先我向接收者发送消息。接收器的结果是在回调函数中获得的。有了这个结果,我需要执行一些解析。现在我怎么能继续循环?

BR, Suppi

使用代码编辑:

-(void)requestData{

for (int i=1; i<3; i++) {

    completeMessage = [self generateMessage:message];
    [self sendMessageToReceiver:completeMessage];
 //now it goes to the callback function to read message from receiver. How do i return to this point?? to continue the loop.
    [self dosomething:result];

}

  }

3 个答案:

答案 0 :(得分:1)

我对iPhone的开发知之甚少,但基于我的异步函数调用经验,你可能不得不重新考虑你的方法 - 假设这是一个异步函数调用。

当你第一次经历循环时,你的代码将调用所有异步函数并继续。它不会等待。如果您希望它等待每个函数调用,那么您不应该使用异步函数或在循环中使用thread.wait或thread.sleep函数。您还可以在循环中使用某种线程同步和信令。例如,您可以进行异步调用,然后您的线程将等待,直到它从您的回调中获得信号继续。

您可能希望将自定义结束处理从循环中取出,并在完成所有回调后执行此操作。您可以将状态放在每个回调的公共位置,并在回调完成后使用它。

当然,您需要等到所有回调完成后再继续。

希望这会有所帮助。

答案 1 :(得分:0)

在单独的帖子中启动消息:

[receiver performSelectorInBackground:@selector(doSomething)];

使用performSelectorInBackground:withObject:如果你想传递一个参数。

答案 2 :(得分:0)

将“for”循环转换为等效的goto语句。然后将goto基本块分解为方法和方法调用,而不使用goto。然后将包含wait的方法分解为2个方法,并在它们之间使用异步调用和回调。您可能必须在实例变量中保存一些local和for循环的隐式状态。

Goto并不总是坏事。它们只是隐含在更易读的结构化和/或OOP消息传递结构中。有时编译器无法为您进行转换,因此您需要了解原始程序控制排序,以便自己完成。