NSDefaultRunLoopMode与NSRunLoopCommonModes

问题描述 投票:109回答:1

尊敬的stackoverflow的好人,

就像上次一样,我特此提出一个我最近偶然发现的问题。我希望外面有人可以给我一些启发。

[每当我尝试下载UIScrollViewMPMapView或其他内容后的大文件时,只要触摸iPhone屏幕,下载过程就会停止。值得庆幸的是,Jörn的一篇很棒的博客文章提出了一种替代方法,即使用NSRunLoopCommonModes进行连接。

这使我详细了解了NSDefaultRunLoopMode和NSRunLoopCommonModes这两种模式,但是苹果文档只说了一点就没有好心地解释了

NSDefaultRunLoopMode

用于处理NSConnection对象以外的输入源的模式。这是最常用的运行循环模式。

NSRunLoopCommonModes

使用此值作为模式添加到运行循环的对象由已声明为“公共”模式集的成员的所有运行循环模式监视;有关详细信息,请参见CFRunLoopAddCommonMode的描述。

CFRunLoopAddCommonMode

源,计时器和观察者将注册到一个或多个运行循环模式,并且仅在运行循环以其中一种模式运行时运行。通用模式是一组运行循环模式,您可以为其定义一组由这些模式共享的源,计时器和观察器。您可以将其注册到运行循环的普通伪模式一次,而不必在每个特定的运行循环模式中注册源,而是将其自动注册到公共模式集的每个运行循环模式中。同样,当将模式添加到一组公共模式时,已注册到该公共伪模式的任何源,计时器或观察者都将添加到新添加的公共模式中。

有人可以用人类语言解释两者吗?

亲爱的stackoverflow的好人,就像上一次一样,我特此提出一个我最近偶然发现的问题。我希望外面有人可以给我一些启发。每当我尝试下载一个...

iphone ios multithreading nsrunloop
1个回答
195
投票

运行循环是一种机制,允许系统唤醒睡眠线程,以便它们可以管理异步事件。通常,当您运行线程(主线程除外)时,可以选择是否在运行循环中启动线程。如果线程运行某种排序或长时间运行的操作而无需与外部事件进行交互且没有计时器,则您不需要运行循环,但是如果您的线程需要响应传入的事件,则应将其附加到运行循环中,以便新事件到来时唤醒线程。 NSURLConnection生成的线程就是这种情况,因为它们仅在传入事件(从网络)中唤醒时才唤醒。

© www.soinside.com 2019 - 2024. All rights reserved.