NSInvocationOperation和主线程

时间:2010-05-17 04:44:04

标签: iphone objective-c thread-safety nsoperationqueue

想象一下,我有一个视图,其中有一些UIKit对象作为其子视图(例如,UIActivityIndicatorView - 这无关紧要)。此视图还有一个名为doSomething的选择器,它以某种方式管理UIKit对象(在我们的示例中,它可以启动或停止指示器视图)。

我使用NSInvocationOperation创建initWithTarget:self selector:@selector(doSomething) object:nil(来自视图的代码部分)。然后将其添加到NSOperationQueue。一切正常。

如何?它应该是一个新的线程和非线程安全的UIKit对象!为什么没有发现错误(没有发生崩溃)?

1 个答案:

答案 0 :(得分:15)

NSInvocationOperation类是NSOperation的具体子类implements a non-concurrent operation

在非并发操作中,the operation’s task is performed synchronously - 也就是说,操作对象不会创建用于运行任务的单独线程。因此,当调用非并发操作的start方法时,操作立即在当前线程中执行。当这样的对象的start方法将控制权返回给调用者时,任务本身就完成了。

但是,使用NSOperationQueue会更改此行为。 NSOperationQueue总是同时执行操作;非并发操作需要一个单独的线程才能同时执行,NSOperationQueue提供了这个线程。

这意味着如果您直接执行NSInvocationOperation,则可以访问UIKit对象的线程安全(该操作将在同一个线程中运行)。在您的情况下,如果使用NSOperationQueue,您应该使用调用选择器中的NSObject performSelectorOnMainThread:withObject:waitUntilDone:来安排在主线程上使用UIKit对象的工作。