代码之家  ›  专栏  ›  技术社区  ›  kpower

nsInvocationOperation和主线程

  •  2
  • kpower  · 技术社区  · 15 年前

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

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

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

    1 回复  |  直到 15 年前
        1
  •  15
  •   luvieere    15 年前

    这个 NSInvocationOperation 类是的具体子类 NSOperation 那个 implements a non-concurrent operation .

    在非并发操作中, the operation’s task is performed synchronously 也就是说,操作对象不会创建单独的线程来运行任务。因此,当 start 调用非并发操作的方法,该操作立即在当前线程中执行。到那时 开始 方法将控件返回给调用方,任务本身已完成。

    然而,使用 NSOperationQueue 更改此行为。nsOperationQueue始终并发执行操作;非并发操作需要单独的线程才能并发执行,以及 操作队列 提供此线程。

    这意味着如果你执行 n定位操作 直接,您就可以访问uikit对象线程安全(该操作将运行在同一线程上)。在您的情况下,如果使用 操作队列 ,您应该使用nsObject的,在主线程上调度使用uikit对象的工作。 performSelectorOnMainThread:withObject:waitUntilDone: 从调用选择器。