在Cocoa中对线程和运行循环的澄清

时间:2010-05-07 14:38:31

标签: cocoa multithreading

我正在尝试了解线程,我很困惑。我确信所有的答案都在苹果文档中,但我发现很难分解和消化。也许有人可以为我清理一件事或者说清楚。

1)performSelectorOnMainThread

上面只是在主运行循环中注册一个事件,或者它是否以某种方式成为一个新线程,即使该方法显示为“mainThread”?如果线程的目的是减轻主线程的处理,这有什么帮助?

2)RunLoops

如果我想创建一个我使用的完全独立的线程,那是真的吗?  “detachNewThreadSelector”?调用start on this会为已创建的线程启动默认运行循环吗?如果是这样,运行循环会进入哪里?

3)最后,我看到了使用NSOperationQueue的例子。是不是说如果使用performSelectorOnMainThread,线程仍然在队列中,所以不需要NSOperation?

4)我应该忘记所有这些而只是使用Grand Central Dispatch吗?

2 个答案:

答案 0 :(得分:26)

运行循环

您可以将Run Loop视为与线程关联的for循环事件处理。这是由系统为每个线程提供的,但它只对主线程自动运行。

请注意,运行run循环和执行线程是两个截然不同的概念。当您只是执行长计算而不必响应各种事件时,您可以在不运行运行循环的情况下执行线程。 如果要响应辅助线程中的各种事件,可以通过

检索与线程关联的运行循环
[NSRunLoop currentRunLoop]

然后运行它。运行循环可以处理的事件称为输入源。您可以将输入源添加到运行循环中。

<强> PerformSelector

performSelectorOnMainThread:将目标和选择器添加到名为 performSelector input source 的特殊输入源。主线程的运行循环使输入源出列,并逐个处理方法调用,作为其事件处理循环的一部分。

<强>的NSOperation / NSOperationQueue

我认为NSOperation是一种在应用程序中显式声明各种任务的方法,这需要一些时间,但可以大部分独立运行。它比使用自己分离新线程和自己维护各种东西更容易。主NSOperationQueue自动维护一组重用的后台线程,并行并行运行NSOperations。 所以,是的,如果你只需要在主线程中排队操作,你就可以取消NSOperationQueue并使用performSelectorOnMainThread:,但这不是NSOperation的要点。

<强> GCD

GCD是Snow Leopard中引入的新基础设施。 NSOperationQueue现已在其上实施。 它适用于功能/块级别。向dispatch_async提供块非常方便,但对于更大块的操作,我更喜欢使用NSOperation,尤其是当应用程序中的各个位置使用该块时。

<强>摘要

您需要阅读Official Apple Doc!关于这一点,还有很多信息丰富的博客文章。

答案 1 :(得分:7)