【问题标题】:NSInvocationOperation and main threadNSInvocationOperation 和主线程
【发布时间】:2011-02-20 06:17:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone objective-c thread-safety nsoperationqueue


    【解决方案1】:

    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 对象的工作。

    【讨论】:

    • 好的,这是一个很好的答案! +1
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多