从Run Loop Modes讲起

说起runloop, 初学者觉得很神秘, 我们很少主动使用runloop, 但却一直都离不开runloop.

从Run Loop Modes讲起_第1张图片
京东首页

相信类似首页绿色框框中的广告条大家都不陌生, 也会有很多人进行过类似的封装, 但是今天要说的是, 当首页滑动时候, 如何能够让广告条继续自动滚动.

这应该是所有开发者在学习iOS初期都会遇到的问题, 我们都会写下类似的代码

    _refreshTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                                     target:self
                                                   selector:@selector(scrollToNextPage:)
                                                   userInfo:nil
                                                    repeats:YES];

但是当我们滑动首页的时候会发现, 广告条不动了, 主线程默认的runloop mode是NSDefaultRunLoopMode但是当滑动的时候, mode被设置成NSEventTrackingRunLoopMode, 这个时候timer就"不好使"了, 所以必须把timer添加到runloop的多种模式才可以, 如果不添加, timer默认是添加到NSDefaultRunLoopMode的.

代码如下

[[NSRunLoop currentRunLoop] addTimer:_refreshTimer
                                     forMode:NSRunLoopCommonModes];

苹果官方文档有这样一段描述

Run Loop Modes
A run loop mode is a collection of input sources and timers to be monitored and a collection of run loop observers to be notified. Each time you run your run loop, you specify (either explicitly or implicitly) a particular “mode” in which to run. During that pass of the run loop, only sources associated with that mode are monitored and allowed to deliver their events. (Similarly, only observers associated with that mode are notified of the run loop’s progress.) Sources associated with other modes hold on to any new events until subsequent passes through the loop in the appropriate mode.

这段大致意思是, 只有那些sources或者timers关联了指定的模式, 才能够在这种模式下被runloop处理, 上面的代码, 就是把timer关联到了NSRunLoopCommonModes, 这样, 当runloop在各种模式下就都能处理timer了.

顺便说下, NSURLConnection也是一样的必须关联到NSRunLoopCommonModes才能在滑动下被runloop处理.

你可能感兴趣的:(从Run Loop Modes讲起)