- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解线程,但我完全感到困惑。我确信所有答案都在苹果文档中,但我发现它真的很难分解和消化。也许有人可以帮我解决一两件事。
1)在主线程上执行Selector
上面是否只是在主运行循环中注册了一个事件,或者它是否以某种方式成为一个新线程,即使该方法说“mainThread”?如果线程的目的是减轻主线程上的处理,这有什么帮助?
2) 运行循环
如果我想创建一个完全独立的线程,我真的可以使用 “分离新线程选择器”?在此调用 start 是否会为已创建的线程启动默认运行循环?如果是这样,运行循环在哪里出现?
3) 最后,我看到了使用 NSOperationQueue 的示例。如果您使用performSelectorOnMainThread,线程无论如何都在队列中,因此不需要NSOperation,这是真的吗?
4)我应该忘记所有这些并只使用 Grand Central Dispatch 吗?
最佳答案
运行循环
您可以将运行循环视为与线程关联的事件处理 for 循环。这是系统为每个线程提供的,但它仅针对主线程自动运行。
请注意,运行运行循环和执行线程是两个不同的概念。当您只是执行长时间计算并且不必响应各种事件时,您可以执行线程而不运行运行循环。如果您想响应来自辅助线程的各种事件,您可以通过
检索与该线程关联的运行循环[NSRunLoop currentRunLoop]
并运行它。运行循环可以处理的事件称为输入源。您可以将输入源添加到运行循环。
执行选择器
performSelectorOnMainThread:
将目标和选择器添加到名为performSelector 输入源的特殊输入源。主线程的运行循环使输入源出队并一一处理方法调用,作为其事件处理循环的一部分。
NSOperation/NSOperationQueue
我想到NSOperation
作为在应用程序内显式声明各种任务的一种方式,这需要一些时间,但基本上可以独立运行。它比自己分离新线程并自己维护各种东西更容易使用。主NSOperationQueue
自动维护一组可重用的后台线程,并运行 NSOperations
在平行下。所以是的,如果您只需要在主线程中对操作进行排队,您可以取消 NSOperationQueue
只需使用 performSelectorOnMainThread:
,但这不是 NSOperation
的要点.
GCD
GCD 是 Snow Leopard 中引入的新基础设施。 NSOperationQueue
现在是在它的基础上实现的。它在功能/ block 级别上工作。将 block 喂给dispatch_async
非常方便,但对于较大的操作 block ,我更喜欢使用 NSOperation
,特别是当该 block 在应用程序的各个位置使用时。
摘要
您需要阅读Official Apple Doc !关于这一点也有许多内容丰富的博客文章。
关于cocoa - 关于 Cocoa 中线程和运行循环的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789357/
我是一名优秀的程序员,十分优秀!