https://blog.csdn.net/huxinguang_ios/article/details/51045810
要解決這個(gè)問題需要了解一下runloop的知識(shí)。runloop可以理解為cocoa下的一種消息循環(huán)機(jī)制,用來處理各種消息事件,我們并不需要手動(dòng)去創(chuàng)建一個(gè)runloop,因?yàn)榭蚣転槲覀儎?chuàng)建了一個(gè)默認(rèn)的runloop,通過 [NSRunloop currentRunloop] 我們可以得到當(dāng)前線程下面對(duì)應(yīng)的runloop對(duì)象,不過我們需要注意的是不同的runloop之間消息的通知方式。在開啟一個(gè)NSTimer或CADisplayLink實(shí)質(zhì)上是在當(dāng)前的runloop中注冊(cè)了一個(gè)新的事件源,而當(dāng)scrollView滾動(dòng)的時(shí)候,當(dāng)前的MainRunLoop是處于 UITrackingRunLoopMode 的模式下,在這個(gè)模式下,是不會(huì)處理 NSDefaultRunLoopMode 的消息(因?yàn)樗鼈兊腞unLoop Mode不一樣)。
解決辦法
要想在scrollview/tableview滾動(dòng)的同時(shí)也接受其它runloop的消息,不管是定時(shí)器采用NSTimer還是CADisplayLink,在把定時(shí)器加入到runloop時(shí),Mode參數(shù)設(shè)置不能設(shè)置為 NSDefaultRunLoopMode,而應(yīng)設(shè)置為 NSRunLoopCommonModes 。