iphone – NSDefaultRunLoopMode vs NSRunLoopCommonModes

亲爱的好人的stackoverflow,

就像最后一次,我在此提出一个我最近跌倒的问题。我希望有人在那里可以给我一些光。

每当我尝试下载一个大文件后面scrollview,mkmapview或东西,下载过程暂停,只要我触摸iPhone屏幕。幸运的是,一个真棒博客文章Jörn建议一个替代选项,使用NSRunLoopCommonModes连接。

这让我看看两个模式的细节,NSDefaultRunLoopMode和NSRunLoopCommonModes,但苹果文档不会解释,除了说

NSDefaultRunLoopMode

The mode to deal with input sources other than NSConnection objects.
This is the most commonly used run-loop mode.

NSRunLoopCommonModes

Objects added to a run loop using this value as the mode are monitored by all run loop modes that have been declared as a member of the set of “common” modes; see the description of CFRunLoopAddCommonMode for details.

CFRunLoopAddCommonMode

Sources, timers, and observers get registered to one or more run loop modes and only run when the run loop is running in one of those modes. Common modes are a set of run loop modes for which you can define a set of sources, timers, and observers that are shared by these modes. Instead of registering a source, for example, to each specific run loop mode, you can register it once to the run loop’s common pseudo-mode and it will be automatically registered in each run loop mode in the common mode set. Likewise, when a mode is added to the set of common modes, any sources, timers, or observers already registered to the common pseudo-mode are added to the newly added common mode.

任何人都可以用人类语言解释这两个?

运行循环是一种机制,允许系统唤醒休眠线程,以便它们可以管理异步事件。通常,当你运行一个线程(除了主线程),有一个选项,在运行循环或不是启动线程。如果线程运行某种排序或长时间运行的操作,没有与外部事件和没有计时器的交互,您不需要运行循环,但是如果您的线程需要响应传入的事件,它应该附加到一个运行循环,以便当新事件到达时唤醒线程。这是NSURLConnection生成的线程的情况,因为它们只在进入的事件(从网络)唤醒。

每个线程可以关联到多个运行循环,或者可以关联到可以设置为以不同模式工作的特定运行循环。 “运行循环模式”是由OS用来建立用于何时递送某些事件或收集它们以稍后递送的某些规则的惯例。

通常所有运行循环都设置为“默认模式”,它建立了管理输入事件的默认方式。例如:鼠标拖动(Mac OS)或触摸(iOS上)事件发生时,此运行循环的模式将设置为事件跟踪;这意味着线程不会在新的网络事件上被唤醒,但是这些事件将在用户输入事件终止并且运行循环再次设置为默认模式时传递;显然,这是由OS架构师做出的选择,以优先于用户事件而不是背景事件。

如果你决定改变你的NSURLConnection线程的运行循环模式,通过使用scheduleInRunLoop:forModes :,然后你可以将线程分配到一个特殊的运行循环模式,而不是特定的默认运行循环。称为NSRunLoopCommonModes的特殊伪模式由许多输入源使用,包括事件跟踪。例如,将NSURLConnection的实例分配给公共模式意味着除了“默认模式”之外,还将其事件关联到“跟踪模式”。将线程与NSRunLoopCommonModes关联的一个优点/缺点是线程不会被触摸事件阻塞。

新模式可以添加到共同模式,但这是一个相当低级的操作。

我想通过添加几个笔记结束:

>通常我们需要使用一组图像或
使用表视图从网络下载的缩略图。我们可能会这样想
在表视图时从网络下载这些图像
滚动可以提高用户体验(因为我们可以看到图像
滚动),但这不是有利的,因为流动性
滚动会受到很大的影响。在本例中使用NSURLConnection不应该使用运行循环;最好使用UIScrollView委托方法来检测滚动终止时,然后更新表和下载新项目
从网络;
>您可以考虑使用GCD,这将帮助您“屏蔽”您的代码
从运行循环管理问题。在上面的例子中,你可以
请考虑将网络请求添加到自定义串行队列。

http://stackoverflow.com/questions/7222449/nsdefaultrunloopmode-vs-nsrunloopcommonmodes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:iphone – NSDefaultRunLoopMode vs NSRunLoopCommonModes