2011-08-21 76 views
0

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

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

在该循环中,第i个发送消息到接收器。接收器的结果在回调函数中获得。有了这个结果,我需要执行一些解析。现在我该如何继续循环?

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

} 

    } 

回答

0

启动的消息在一个单独的线程:

[receiver performSelectorInBackground:@selector(doSomething)]; 

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

+0

以及它已经运行在一个单独的线程。在发送消息后,我将如何返回被调用的函数?请看我的编辑 – Suppi

+0

对不起,显然我误解了你的原始问题:) 如果你想让所有的东西都等待并同步,你可以使用主线程进行所有的处理。 – andreamazz

1

我对iPhone开发了解不多,但基于我的异步函数调用体验,您可能需要重新考虑您的方法 - 假设这是一个异步函数调用。

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

您可能希望将自定义的结束处理置于循环之外,并在所有回调完成后执行。您可以将状态置于每个回调的公共位置,并在回调完成后使用它。

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

希望这会有所帮助。

+0

嗯,我也在想同样的情况,但询问是否有更好的方法。那么我现在部署了类似的东西,它似乎工作正常。非常感谢您宝贵的建议。 – Suppi

0

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

Goto's并不总是坏的。它们只是隐含在更易读的结构化和/或OOP消息传递结构中。有时候编译器不能为你做转换,所以你需要对原始程序控制排序有足够的了解才能自己做。