创建自定义NSRunLoop

时间:2009-11-18 03:02:52

标签: iphone cocoa-touch

我开始将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函数创建自定义源的文档,但我没有看到如何将所有这些插件组合在一起的明确示例。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

要继续,请拨打CFRunLoopRun $ 或附加CF或NS计时器

如果您想缓存运行循环(对于连续调用,您可以)。也许最好从子类化NSThread(你的工作组var)开始,并提供它要做的事情,并在完成时报告一些事情(这是真正的多线程困境开始的地方)。因此,运行循环附加一个计时器,一直工作直到完成,如果计划继续,则休眠。我希望这是有道理的,作为一个概述。

  

我是否在启动时缓存对此运行循环的引用?

如果您只需要从工作线程中获取它,那就没有必要了。

  

如何启动运行循环并让它等待工作?

您可以通过启动线程并从线程访问它来启动它。通过告诉它运行(即在模式下)或附加计时器继续运行。

答案 1 :(得分:0)

您是否阅读过section on run loops in the Apple Threading Programming Guide?这看起来是一个非常好的起点。它讨论了运行循环的方法和原因,以及输入源,以及-performSelector的各种风格(线程之间相互通信的主要方式之一)。