当tableview/scrollview滚动时定时器NSTimer / CADisplayLink停止响应问题

在使用NSTimer 的时候 进行设置轮播图 我们
都会先创建一个
timer
self.timer = Timer.init(timeInterval: TimeInterval(stayDuration), target: self, selector: #selector(GHVerticalArdView.scrollAnimate), userInfo: nil, repeats: true)

然后把他添加到当前的runloop中。

//commonModes defaultRunLoopMode
RunLoop.current.add(timer, forMode: .commonModes)

但是 在使用 defaultRunLoopMode 时发现
在tableView滚动 或者 reloadData的时候
停止工作

好神奇
其实就是runloop的mode在做怪。runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。

在开启一个NSTimer或CADisplayLink实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样),要想在scrollView滚动的同时也接受其它runloop的消息,就不能将Mode参数设置为NSDefaultRunLoopMode,而应该设置为NSRunLoopCommonModes。

你可能感兴趣的:(当tableview/scrollview滚动时定时器NSTimer / CADisplayLink停止响应问题)