【问题标题】:Threads that don’t have a runloop没有运行循环的线程
【发布时间】:2023-03-06 15:16:01
【问题描述】:

我正在阅读核心动画编程指南,在“事务”一章中,我看到了这个

重要提示:从不修改的线程修改图层属性时 有一个运行循环,你必须使用显式事务。

但来自 Apple 的 documentation on NSRunLoop

您的应用程序无法创建或显式管理 NSRunLoop 对象。每个 NSThread 对象,包括应用程序的主线程 线程,有一个自动为其创建的 NSRunLoop 对象 需要。

不是说每个线程都有一个runloop吗?或者不是NSThread创建的线程,比如POSIX的pthread

【问题讨论】:

  • 每个 NSThread 都有一个运行循环,但我想你也可以在 C 中创建线程。
  • 如果您使用 pthreads,您可以查看相关问题的答案:stackoverflow.com/questions/4930957/…

标签: ios nsthread runloop


【解决方案1】:

它说“每个NSThread 对象,包括应用程序的主线程,都有一个根据需要自动为其创建的NSRunLoop 对象。”

如果您不做任何尝试访问线程的运行循环的操作,系统将不会为该线程创建运行循环。

如果您不执行[[NSRunLoop currentRunLoop] run](或类似的操作),您的线程将不会运行其运行循环。

UIApplicationMain 函数为主线程处理这个问题。对于您创建的线程,如果您希望线程的运行循环有任何效果,则需要运行线程的运行循环。

当您不使用显式事务时,这就是(我认为)Core Animation 的情况。它开始一个事务,并在当前线程的运行循环中注册一个回调以提交它。 (如有必要,这将为当前线程创建一个运行循环。)如果您没有运行线程的运行循环,则永远不会调用该回调。

【讨论】:

  • "如果你不做任何尝试访问线程的运行循环的事情,系统将不会为该线程创建运行循环。" - 如果您可以分享一些解释这部分的文档的链接,那将非常有用。或者也许这是你的猜测?
  • 原始问题引用了相关的NSRunLoop文档,我的答案的第一行再次引用了它。我不确定还有什么要说的。也欢迎您亲自检查the CFRunLoopGetCurrent source code
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2018-07-13
  • 2021-09-14
  • 1970-01-01
  • 2021-05-23
  • 2021-02-09
相关资源
最近更新 更多