tableView或者scrollView滑動時 定時器 不響應

先寫解決辦法

1.

NStimer * timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer:) userInfo:nil repeats:YES];

將定時器加入到循環機制中
[[NSRunLoop mainRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

2.

使用GCD創建定時器。GCD創建定時器不收Runloop的影響,并且GCD的定時器更精準。

原因

1.當tableView和scrollView滑動的時候 定時器的時間不響應 是蘋果的響應機制的原因

詳解看http://blog.csdn.net/meegomeego/article/details/48547583

2.有關NSTimer的創建方式,NSTimer的創建方法有兩種

NSTimer * timer = [NSTimerscheduled TimerWithTimeInterval:1.0f target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

或者

NSTimer * timer =  [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

注意: 1.使用NSTimerscheduled 的初始化方法將以默認mode(NSDefaultRunLoopMode)直接添加到runloop中

2.不用scheduled方式初始化的,需要手動addTimer:forMode:將timer添加到一個runloop中(一般也會將Mode設置為NSDefaultRunLoopMode)。


關于runloop的知識:其實就是runloop的mode在做怪。runloop可以理解為cocoa下的一種消息循環機制,用來處理各種消息事件,我們在開發的時候并不需要手動去創建一個runloop,因為框架為我們創建了一個默認的runloop,通過[NSRunloop currentRunloop]我們可以得到一個當前線程下面對應的runloop對象,不過我們需要注意的是不同的runloop之間消息的通知方式。在開啟一個NSTimer或CADisplayLink實質上是在當前的runloop中注冊了一個新的事件源,而當scrollView滾動的時候,當前的MainRunLoop是處于UITrackingRunLoopMode的模式下,在這個模式下,是不會處理NSDefaultRunLoopMode的消息(因為RunLoop Mode不一樣),要想在scrollView滾動的同時也接受其它runloop的消息,就不能將Mode參數設置為

NSDefaultRunLoopMode,而應該設置為NSRunLoopCommonModes

參考網址:

1.http://blog.csdn.net/huxinguang_ios/article/details/51045810
2.http://my.oschina.net/u/2340880/blog/398598
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飄金閱讀 1,006評論 0 4
  • https://blog.ibireme.com/2015/05/18/runloop/ RunLoop 是 iO...
    SmallDe閱讀 708評論 0 51
  • RunLoop的概念 一般來講,一個線程一次只能執行一個任務,執行完成后線程就會退出。如果我們需要一個機制,讓線程...
    SunZzzl閱讀 238評論 0 1
  • Runloop是iOS和OSX開發中非常基礎的一個概念,從概念開始學習。 RunLoop的概念 -般說,一個線程一...
    小貓仔閱讀 1,019評論 0 1
  • 總有神奇在發生 ——星符號 中國時尚界傳奇大秀、電視節目錄制現場、未來式趨勢發布會——這一次,星符號直接上演“時裝...
    蜘蜘紡閱讀 239評論 0 0