可可 - 从NSOperation返回信息

时间:2009-08-19 03:53:16

标签: iphone cocoa cocoa-touch multithreading nsoperation

我有一个使用webservices从服务器获取数据的iPhone应用程序。我将每个调用放在一个NSOperation子类中的web服务,以便它可以被线程化。我的问题是,从完整的NSOperation子类传回信息的推荐方法是什么。我目前正在我的main方法结束时发送NSNotification,并且正在等待NSOperation完成的任何代码订阅通知。然后我将使用NSNotificationWithName:Object:的对象部分来从操作中传回信息。

我不确定是否有更好的方法来做到这一点。我听说过Key Value Coding然后我可以使用Key Value Observing来检测操作的isFinished属性何时被更改,但我不确定最佳实践是什么。

我也在努力确保我的应用程序是线程安全的,我认为只要我的通知在main方法结束时发出就不会出现问题,因此通知中的对象就不会因为它将结束所以在线程中使用的时间更长。

最后,我这样称呼通知:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:[NSNotification notificationWithName:@"notificationName" object:dataObject] waitUntilDone:NO];

3 个答案:

答案 0 :(得分:16)

我个人以两种方式完成了这项工作。两者都运作良好。

第一种方式

您可以使用一个返回“输出”的函数,并在操作完成后调用该函数。您可以观察isFinished对象上的键NSOperation,或使用-[NSOperationQueue waitUntilAllOperationsAreFinished]确定操作何时完成。

第二种方式

您可以使用NSOperation中的委托或目标/操作。只需确保在调用委托函数或触发目标/操作时,使用-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

在主线程上执行此操作

答案 1 :(得分:1)

这取决于您的申请。您希望同时运行多少个操作?你在做什么结果?结果是聚合还是需要立即在UI中显示?

在主线程上发送通知非常重要。根据您对结果所做的操作,您可能会阻塞UI。从设计角度来看,您将从通知中发送的对象是观察类应该知道的内容吗?从操作中更改模型对象可能更有意义,并让控制器对象观察这些更改。

您可以使用键值观察,但必须小心。观察者在同一个线程中观察到发生了更改,因此在观察isFinished时不应直接进行UI更改。

如果对象仅由操作拥有和使用,那么是的,在main的末尾发送应该是安全的。它将由通知保留。

答案 2 :(得分:0)

当你想从操作中获得结果时,doc说最好使操作成员变量。但我认为解决方案不会适应你。

我认为通知很好,还有另一种方法可以让结果为你自己的操作制作一个完成块。见这里:Return data from NSOperation?我试过它做得很好。

我之前尝试过另一种方法。设置操作完成块,并对操作进行弱引用,并使结果成为操作属性。这样你就可以在完成后获得操作结果。

但是完成是不可靠的,当你取消操作时也完成了。所以选择最适合你。