前言:上一回實現了輪播器的自動滾動,可是有兩個須要處理的bug.ios
1.增長需求:當用手拖拽控制輪播器的時候,中止自動滾動.多線程
2.當同一個頁面中有tableView,textView或scrollview時,拖拽這些控件時:輪播器會中止自動輪播,卡住;當鬆開這些控件時:輪播器先快速輪播,把卡住的時間補回來,再恢復正常.oop
緣由:界面的控件都是主線程建立的,和用戶的操做也都是在主線程中處理的. 當用戶拖拽另外的控件時,主線程就忙着處理這些拖拽行爲,就不能同時處理輪播器的滾動事件了.spa
解決問題1:線程
1>.當多出用到一樣的代碼時,提取成一個方法:本demo中有兩處: 添加定時器,移除定時器 代理
// 添加定時器 - (void)addTimer { self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES]; // 解決拖動其餘控件的時候,圖片輪播器不能響應的問題 // 獲取當前主線程的消息循環,把self.timer加到主運行循環中.NSRunLoopCommonModes能夠同時處理多個事件.
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } // 移除定時器 - (void)removeTimer { [self.timer invalidate]; // 因此清空self.timer self.timer = nil; }
2>使用代理方法解決問題1. 立即將拖拽時,移除定時器. 完成拖拽是啓動定時器.code
#pragma mark - 代理方法 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { // 1.中止定時器,定時器一旦中止,就不能重用了 [self removeTimer]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { // 啓動定時器 [self addTimer]; }
解決問題2:blog
方法1>多線程處理.這裏不行. 在ios中處理UI界面的事件,只能在主線程中執行,不能用其餘的線程來處理.若是多個線程來處理UI界面.極可能形成混亂衝突.例如UI顯示一份數據.要保證同一時間,只有一我的能夠修改這份數據. 若是多線程的話就能夠有多我的同一時間進行操做.就會衝突.事件
方法2>提升Scrollview拖拽事件的優先級,就是讓主線程同時處理這兩個事件.圖片
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];// 獲取當前主線程的消息循環,把self.timer加到主運行循環中.NSRunLoopCommonModes能夠同時處理多個事件.