假设我有一个视图,其中包含一些UIKit对象作为其子视图(例如,UIActivityIndicatorView -这无关紧要)。这个视图还有一个选择器,称为doSomething,它以某种方式管理UIKit对象(在我们的示例中,它可以启动或停止指示器视图)。
我用initWithTarget:self selector:@selector(doSomething) object:nil创建NSInvocationOperation (从视图的代码部分)。然后将其添加到NSOperationQueue。一切都很好。
怎么做?!它应该是一个新的线程和非线程安全的UIKit对象!为什么没有发现错误(也没有发生崩溃)?
发布于 2010-05-17 13:30:32
NSInvocationOperation类是NSOperation implements a non-concurrent operation的具体子类。
在非并发操作中,即the operation’s task is performed synchronously-that,操作对象不会创建单独的线程来运行任务。因此,当调用非并发操作的start方法时,该操作将立即在当前线程中执行。当这样的对象的start方法将控制权返回给调用者时,任务本身就完成了。
但是,使用NSOperationQueue会更改此行为。NSOperationQueue总是并发执行操作;非并发操作需要单独的线程才能并发执行,NSOperationQueue提供了这个线程。
这意味着如果您直接执行NSInvocationOperation,您将能够以线程安全的方式访问UIKit对象(该操作将在同一线程上运行)。在您的示例中,如果使用NSOperationQueue,则应该从调用选择器使用NSObject的performSelectorOnMainThread:withObject:waitUntilDone:来调度在主线程上使用NSObject对象的工作。
https://stackoverflow.com/questions/2846714
复制相似问题