我开始将RunLoop理解为类似于Java中的事件队列。 Wgat我现在正试图做,只是为了更好地理解,是在运行自己的RunLoop的应用程序中创建一个后台线程。我在一个示例ViewController中得到了这个,然后卡住了:
@implementation iPhoneRunLoopsViewController
-(void) workerMain
{
[[NSRunLoop currentRunLoop] run];
}
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
worker = [[NSThread alloc] initWithTarget:self selector:@selector(workerMain) object:nil];
[worker start];
}
- (IBAction)go:(id)sender {
}
根据Apple的文档:
在a上运行循环之前 辅助线程,你必须添加 至少一个输入源或计时器。 如果运行循环没有任何 要监控的来源,它退出 当你试图运行它时立即。 有关如何添加源的示例 运行循环,请参阅“Configuring Run Loop Sources.”
我正在尝试在我的init方法中启动一个用于任意工作的自定义线程。我想将“go”方法的工作发送到这个任意线程中。我不知道的是如何将工作发送到RunLoop,例如go方法,它将连接到Go按钮。假设我想从1-10开始计算,并且在这个辅助线程的每一步之间有一个小的延迟。我在我的go方法中添加代码来使用辅助线程的RunLoop来调度工作,执行类似performOnThread的操作...我是否在启动时缓存对此运行循环的引用?如何启动运行循环并使其等待工作? (如何使用自定义输入源配置运行循环?)显然,如果运行循环没有计时器或输入源,则run方法将返回。我已经看过讨论如何使用CF函数创建自定义源的文档,但我没有看到如何将所有这些插件组合在一起的明确示例。有人可以帮忙吗?
答案 0 :(得分:1)
要继续,请拨打CFRunLoopRun $ 或附加CF或NS计时器
如果您想缓存运行循环(对于连续调用,您可以)。也许最好从子类化NSThread(你的工作组var)开始,并提供它要做的事情,并在完成时报告一些事情(这是真正的多线程困境开始的地方)。因此,运行循环附加一个计时器,一直工作直到完成,如果计划继续,则休眠。我希望这是有道理的,作为一个概述。
我是否在启动时缓存对此运行循环的引用?
如果您只需要从工作线程中获取它,那就没有必要了。
如何启动运行循环并让它等待工作?
您可以通过启动线程并从线程访问它来启动它。通过告诉它运行(即在模式下)或附加计时器继续运行。
答案 1 :(得分:0)
您是否阅读过section on run loops in the Apple Threading Programming Guide?这看起来是一个非常好的起点。它讨论了运行循环的方法和原因,以及输入源,以及-performSelector
的各种风格(线程之间相互通信的主要方式之一)。