我正在尝试了解线程,我很困惑。我确信所有的答案都在苹果文档中,但我发现很难分解和消化。也许有人可以为我清理一件事或者说清楚。
1)performSelectorOnMainThread
上面只是在主运行循环中注册一个事件,或者它是否以某种方式成为一个新线程,即使该方法显示为“mainThread”?如果线程的目的是减轻主线程的处理,这有什么帮助?
2)RunLoops
如果我想创建一个我使用的完全独立的线程,那是真的吗? “detachNewThreadSelector”?调用start on this会为已创建的线程启动默认运行循环吗?如果是这样,运行循环会进入哪里?
3)最后,我看到了使用NSOperationQueue的例子。是不是说如果使用performSelectorOnMainThread,线程仍然在队列中,所以不需要NSOperation?
4)我应该忘记所有这些而只是使用Grand Central Dispatch吗?
答案 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)