Iphone Cocoa-从NSO操作返回信息

Iphone Cocoa-从NSO操作返回信息,iphone,cocoa,cocoa-touch,multithreading,nsoperation,Iphone,Cocoa,Cocoa Touch,Multithreading,Nsoperation,我有一个IPhone应用程序,它使用Web服务从服务器获取数据。我将每个对webservice的调用放在一个NSOperation子类中,这样它就可以被线程化。我的问题是,建议使用什么方法从已完成的NSOperation子类传回信息。我当前正在主方法末尾发送一个NSNotification,任何等待NSOperation完成的代码都会订阅该通知。然后我将使用NSNotificationWithName:object:的对象部分从操作返回信息 我不确定是否有更好的方法。我听说过键值编码,然后我可以

我有一个IPhone应用程序,它使用Web服务从服务器获取数据。我将每个对webservice的调用放在一个NSOperation子类中,这样它就可以被线程化。我的问题是,建议使用什么方法从已完成的NSOperation子类传回信息。我当前正在主方法末尾发送一个NSNotification,任何等待NSOperation完成的代码都会订阅该通知。然后我将使用NSNotificationWithName:object:的对象部分从操作返回信息

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

我还试图确保我的应用程序是线程安全的,我假设只要我的通知在主方法的末尾发出就不会有问题,因此通知中的对象将不再在线程中使用,因为它将结束

最后,我这样称呼通知:

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

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

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

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


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

我个人通过两种方式完成了这项工作。两种方法都很有效

第一条路

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

第二种方式


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

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

我认为通知是好的,还有另一种方法可以得到结果,那就是为你自己的操作创建一个完成块

我以前尝试过另一种方法。设置操作完成块,对操作进行弱引用,并将结果作为操作的属性。因此,您可以在完成后获得操作结果

但是完成是不可靠的,当你取消操作时,完成也会执行。因此,请为您选择最好的。

医生说,您可能会喜欢它。