2

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

NSInvocationOperationinitWithTarget:self selector:@selector(doSomething) object:nil. 然后将其添加到NSOperationQueue. 一切正常。

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

4

1 回答 1

15

该类是实现非并发操作NSInvocationOperation的具体子类。NSOperation

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

但是,使用NSOperationQueue会改变这种行为。NSOperationQueue 总是并发执行操作;非并发操作需要单独的线程才能并发执行,并NSOperationQueue提供该线程。

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

于 2010-05-17T05:30:32.203 回答