iphone - cocoa 中的 NSRunLoops?

标签 iphone multithreading cocoa nsthread nsrunloop

假设我有 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/

相关文章:

java - ReentrantLock and Condition,最佳设计

ios - 更新标签使 UIImageview 不可见的线程问题

cocoa - 基于 View 的 NSOutlineView 中的 Finder 样式 float 组行

iphone - 苹果股票应用程序中的图表

iphone - iPhone 版 Google 移动分析的调度问题

ios - 带有包含自定义单元格的 UITableView 的 UISearchBar => 空白单元格

Objective-C 的 "obj performSelector"vs objc_msgSend( )?

iphone - 在 View Controller 中显示带有图像和标签的 Headerview

java - 在线程实例上使用 sleep(long) 的副作用

objective-c - 无法更改 NSButton 字体