想象一下,我有一个视图,其中有一些UIKit对象作为其子视图(例如,UIActivityIndicatorView
- 这无关紧要)。此视图还有一个名为doSomething
的选择器,它以某种方式管理UIKit对象(在我们的示例中,它可以启动或停止指示器视图)。
我使用NSInvocationOperation
创建initWithTarget:self selector:@selector(doSomething) object:nil
(来自视图的代码部分)。然后将其添加到NSOperationQueue
。一切正常。
如何?它应该是一个新的线程和非线程安全的UIKit对象!为什么没有发现错误(没有发生崩溃)?
答案 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对象的工作。