gpt4 book ai didi

iphone - cocoa 中的 NSRunLoops?

转载 作者:行者123 更新时间:2023-12-03 16:23:48 25 4
gpt4 key购买 nike

假设我有 2 个线程,一个是主线程,另一个是辅助线程。主线程使用最多,但有时(很少)我希望辅助线程根据主线程的调用执行一些工作。大多数时候辅助线程应该休眠。现在,经过一番搜索,我明白做到这一点的方法是使用 runLoops。所以我尝试阅读苹果的文档( http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW5 )

但在我看来,它非常复杂,我在那里遇到了一些困难。有没有一种优雅而简单的方法来实现我所描述的?有没有类似的 runLoop 代码示例可供我运行和使用?

谢谢

最佳答案

每个线程都有一个运行循环。

每个运行循环都有一个需要完成的事情列表。这些事情据说是在运行循环上“安排”的,尽管并非所有事情都安排在特定的日期和时间:

  • 定时器是。
  • 来源不是。它们通常会等待某些东西来敲击 Mach 内核端口或文件描述符。

当运行循环运行时,它通常不运行——也就是说,线程正在休眠,不消耗任何CPU周期。 (如果你对其进行采样,你会发现进程似乎陷入了mach_msg_trap。这是“等待某事发生”系统调用。)内核唤醒线程(从而从 mach_msg_trap 返回)当发生线程运行循环需要处理的事情时。

完全按照您所描述的方式执行的方法是实现 run loop source 。您将源安排在辅助线程的运行循环上,通过执行工作来实现它,并在有工作要做时从主线程发出信号。

但是,NSOperation 几乎肯定是一个更好的解决方案,因为它是针对您所描述的情况而设计的:需要连续完成的离散工作单元,一次最多为 N(您选择且至少为 1)。

请注意,NSOperationQueue 重用线程,因此它不一定为每个操作创建一个新线程。事实上,不这样做是要点的一部分:它懒惰地创建线程,并使用任何它已经拥有但不执行任何操作的线程。

关于iphone - cocoa 中的 NSRunLoops?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3768376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com