7

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

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

我还试图确保我的应用程序是线程安全的,我认为这不会是一个问题,只要我的通知是在 main 方法结束时发出的,因此通知中的对象将不再被使用在线程中,因为它会结束。

最后,我这样调用通知:

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

3 回答 3

16

我个人以两种方式做到了这一点。两者都工作得很好。

第一种方式

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

第二种方式

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

于 2009-08-19T05:39:19.273 回答
1

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

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

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

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

于 2009-08-19T04:39:16.603 回答
0

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

我认为通知很好,还有另一种获得结果的方法是为您自己的操作创建一个完成块。请参阅此处:从 NSOperation 返回数据? 我试过了,效果很好。

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

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

于 2015-04-08T09:50:02.067 回答