一般主线程会自动运行runloop,我们一般情况下不用管。而在子线程中,我们需要手动去运行它。你可以把它想象成一个循环,如果没有这个循环,子线程完成任务后,这个线程就结束了。所以这个时候我们就要运行一个runloop,用于处理种种事件,而让它不结束。而没有事件发生的时候, 会处于休眠状态,以节省电量。
那么一般在什么情况下用到呢
需要使用Port或者自定义Input Source与其他线程进行通讯。
需要在线程中使用Timer。
需要在线程上使用performSelector*****方法。
需要让线程执行周期性的工作。
举个例子 定义一个NSTimer来隔一会调用某个方法 但这时你在拖动textVIew不放手 主线程就被占用了。 timer的监听方法就不调用 直到你松手 ,,这时吧nstimer加到 runloop里 就相当于告诉主循环 腾出点时间来给timer ,再拖动textView就不会因主线程被占用而不调用了
应用场景举例:主线程的 RunLoop 里有两个预置的 Mode:kCFRunLoopDefaultMode 和 UITrackingRunLoopMode。这两个 Mode 都已经被标记为"Common"属性。DefaultMode 是 App 平时所处的状态,TrackingRunLoopMode 是追踪 ScrollView 滑动时的状态。当你创建一个 Timer 并加到 DefaultMode 时,Timer 会得到重复回调,但此时滑动一个TableView时,RunLoop 会将 mode 切换为 TrackingRunLoopMode,这时 Timer 就不会被回调,并且也不会影响到滑动操作。
有时你需要一个 Timer,在两个 Mode 中都能得到回调,一种办法就是将这个 Timer 分别加入这两个 Mode。还有一种方式,就是将 Timer 加入到顶层的 RunLoop 的 "commonModeItems" 中。"commonModeItems" 被 RunLoop 自动更新到所有具有"Common"属性的 Mode 里去
// 下面一行timer是已经被添加进去
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
// 下面一行, 该线程的runloop会运行起来,timer才会起作用
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];