Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa中线程和运行循环的说明_Cocoa_Multithreading - Fatal编程技术网

Cocoa中线程和运行循环的说明

Cocoa中线程和运行循环的说明,cocoa,multithreading,Cocoa,Multithreading,我正在努力学习线程技术,但我完全搞糊涂了。我确信所有的答案都在苹果的文档中,但我发现很难分解和消化。也许有人能帮我清理一下 1) performSelectorOnMainThread 上面的方法是简单地在主运行循环中注册一个事件,还是一个新线程,即使该方法说“mainThread”?如果线程的目的是减轻主线程上的处理,那么这有什么帮助 2) 运行循环 如果我想创建一个完全独立的线程,我会使用 “线程选择器”?对此调用start是否会启动已创建线程的默认运行循环?如果是这样,运行循环从何而来 3

我正在努力学习线程技术,但我完全搞糊涂了。我确信所有的答案都在苹果的文档中,但我发现很难分解和消化。也许有人能帮我清理一下

1) performSelectorOnMainThread

上面的方法是简单地在主运行循环中注册一个事件,还是一个新线程,即使该方法说“mainThread”?如果线程的目的是减轻主线程上的处理,那么这有什么帮助

2) 运行循环

如果我想创建一个完全独立的线程,我会使用 “线程选择器”?对此调用start是否会启动已创建线程的默认运行循环?如果是这样,运行循环从何而来

3) 最后,我看到了使用NSOperationQueue的示例。如果使用performSelectorOnMainThread,线程仍然在队列中,因此不需要NSOperation,这是真的吗


4) 我是否应该忘记所有这些,改用大中央调度?

运行循环

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

请注意,运行运行循环和执行线程是两个截然不同的概念。当您只是执行长时间的计算并且不必响应各种事件时,您可以执行线程而不运行运行运行循环。 如果希望从辅助线程响应各种事件,可以通过以下方式检索与该线程关联的运行循环:

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

性能选择器

performselectornmainthread:
将目标和选择器添加到名为performSelector输入源的特殊输入源。作为事件处理循环的一部分,主线程的run循环将输入源和逐个处理方法调用的队列排出

NSOperation/NSOperationQueue

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

GCD

GCD是雪豹中引入的一种新基础设施<代码>NSOperationQueue现在在其上实现。 它在功能/块级别工作。将块馈送到
dispatch\u async
非常方便,但对于更大的操作块,我更喜欢使用
NSOperation
,尤其是当该块在应用程序中的不同位置使用时

摘要

你需要阅读!关于这一点,也有很多信息丰富的博客文章

1) performSelectorOnMainThread

以上是否只是在主运行循环中注册事件

您正在询问实施细节。不要担心它是如何工作的

它所做的是在主线程上执行该选择器

…或者它是一个新的线程,即使这个方法说“mainThread”

没有

如果线程的目的是减轻主线程上的处理,那么这有什么帮助

当您需要在主线程上执行某些操作时,它会帮助您。一个常见的例子是更新UI,这应该总是在主线程上进行

在新的辅助线程上执行操作还有其他方法,尽管NSOperationQueue和GCD通常是更简单的方法

2) 运行循环

如果我想创建一个完全独立的线程,我会使用“detachNewThreadSelector”吗

这与运行循环无关

是的,这是启动新线程的一种方法

对此调用start是否会启动已创建线程的默认运行循环

没有

我不知道你在这里“调用
start
on”什么<代码>detachNewThreadSelector:不返回任何内容,它会立即启动线程。我想你把它和NSO操作混在一起了(你自己也不启动,这是队列的工作)

如果是这样,运行循环从何而来

运行循环只存在,每个线程一个。在实现方面,它们可能是根据需要惰性地创建的

3) 最后,我看到了使用NSOperationQueue的示例。如果使用performSelectorOnMainThread,线程仍然在队列中,因此不需要NSOperation,这是真的吗

这两件事无关

performSelectorOnMainThread:
完全执行以下操作:在主线程上执行选择器

NSO操作在辅助线程上运行,每个操作一个

操作队列确定操作(及其线程)的启动顺序

线程本身不会排队(调度程序可能会例外,但这是内核的一部分,而不是应用程序)。操作排队,并按顺序启动。一旦启动,它们的线程将并行运行

4) 我是不是应该忘记这一切,改用中央调度台

GCD与操作队列的概念大致相同。只要你不理解另一个,你就不会理解其中一个


那么这些东西有什么好处呢? 运行循环 在线程中,一种安排事情发生的方法。一些m