NSInvocationOperation和主线程

kpo*_*wer 2 iphone objective-c thread-safety nsoperationqueue

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

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

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

luv*_*ere 15

NSInvocationOperation班是一个具体子类,NSOperation实现非并发操作.

在非并发操作中,操作的任务是同步执行的 - 也就是说,操作对象不会创建运行任务的单独线程.因此,当start调用非并发操作的方法时,操作立即在当前线程中执行.当start这样的对象的方法将控制返回给调用者时,任务本身就完成了.

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

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