拖動scrollView時定時器活動停止的解決方案
最近在開發中計劃實現一個滾動新聞(TableView的其中cell中實現),於是我定義了一個NSTimer定時器開實現一直滾動,但是當我發現了當我拖懂TableView時候,滾動新聞就停止了.
於是我首先想到的是用GCD建立一個非同步執行緒,將定時器放到這裡,為了讓定時器更準確,我在定時器後面新增了[[NSRunLoop currentRunLoop] run];(因為定時器在子執行緒中預設是不啟動的) 之後確實實現了拖動tableView的時候,滾動新聞也滾動,但是dang當進入別的頁面在返回當前頁面的時候,有時會發生記憶體錯誤
-[UIViewAnimationState class]: message sent to deallocated instance 0x7fc9ec351490
在終端定位找到
rollNewCell timer] | -[NSRunLoop(NSRunLoop) run] | -[NSRunLoop(NSRunLoop) runMode:beforeDate:] | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoTimer | __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ | __NSFireTimer | -[SQ_ScrollNewCell timerChanged:] |
我才發現是之前nstimer定時器的問題
經過查閱資料和別人幫助終於找到了解決方案
直接在主執行緒設定NSTimer
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(timerChanged:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
//:NSRunLoopCommonModes,這個模式等效於NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的結合。
結論
當系統啟動時會預設建立一個runloop模式是NSDefaultRunLoopMode,當使用NSTimer的scheduledTimerWithTimeInterval方法時。事實上此時Timer會被加入到當前執行緒的RunLoop中,且模式是預設的NSDefaultRunLoopMode。而如果當前執行緒就是主執行緒,也就是UI執行緒時,某些UI事件,比如UIScrollView的拖動操作,會將Run Loop切換成NSEventTrackingRunLoopMode模式,在這個過程中,預設的NSDefaultRunLoopMode模式中註冊的事件是不會被執行的。也就是說,此時使用scheduledTimerWithTimeInterval新增到Run Loop中的Timer就不會執行。
所以為了設定一個不被UI干擾的Timer,我們需要手動建立一個Timer,然後使用NSRunLoop的addTimer:forMode:方法來把Timer按照指定模式加入到Run Loop中。這裡使用的模式是:NSRunLoopCommonModes,這個模式等效於NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的結合。
這個問題開啟了我對runloop的學習的興趣
相關文章
- JS定時器不可靠的原因及解決方案JS定時器
- Java定時任務解決方案Java
- 解決 ScrollView 巢狀 RecyclerView 時,慣性滑動失效的問題View巢狀
- Oracle EBS 執行2小時自動停止,重起WEB 2小時又停止的問題解決.OracleWeb
- SQL超時解決方案-有時並不是設定問題SQL
- Oracle ERP 執行2小時自動停止,重起WEB 2小時又停止的問題解決.OracleWeb
- 定時任務報警通知解決方案詳解
- 主流定時任務解決方案全橫評
- Python定時任務輕量解決方案---SchedulePython
- 優雅的快取解決方案--設定過期時間快取
- SpringBoot專案動態定時任務之 ScheduledTaskRegistrar(解決方案一)Spring Boot
- Node 定時器詳解定時器
- NTP時間同步伺服器(區域網時鐘同步)解決方案伺服器
- 定時器以及定時器的幾個案例定時器
- golang定時任務踩坑及終極解決方案Golang
- Go構建遇到cgo動態庫時解決方案Go
- mysql定時器event詳解MySql定時器
- iOS 時間校準解決方案iOS
- 微服務架構下的輕量級定時任務解決方案微服務架構
- 內網外網伺服器時間同步解決方案內網伺服器
- 另類的曲線方式定時Start up/Shut down VM 的解決方案
- 定時器定時器
- Go 的定時器Go定時器
- win10 點選自動設定時間時間快1小時怎麼解決Win10
- 工程make時出現"時鐘錯誤的問題"的解決方案
- axios請求超時解決方案iOS
- SQL Server與伺服器連線時出錯的解決方案SQSQLServer伺服器
- 多語言與多時區的解決方案
- transitionEnd和animationEnd的一個臨時解決方案
- 四種方案解決ScrollView巢狀ListView問題View巢狀
- CentOS 7 SSH 連線超時自動斷開解決方案CentOS
- C#實現窗體拖動、不允許窗體拖動、任意控制元件執行時拖動C#控制元件
- [iOS]各種定時器–最全的定時器使用iOS定時器
- ScrollView 與ListView 滑動衝突解決View
- 顯示器驅動程式停止響應的解決辦法
- 建立cache group 時遇到 錯誤5120 時候的解決方案
- 直播電商原始碼,活動開始時間計時器原始碼
- Scrollview 和 內部 recycleview 高度固定時巢狀衝突的一種解決方法View巢狀