我們在scrollView上面放一個UIButton 點擊button開始倒計時,開發(fā)過程中最常用的地方也就是獲取驗證碼的業(yè)務啦! 好多童鞋常用的方法就是創(chuàng)建了一個UITableView 在cell上面放了一個UIButton,點擊button的時候啟動一個NSTimer 然后開始倒計時,這時候你會發(fā)現 當我用手托住UITableView的時候,倒計時竟然神奇的停止了,這到底是為什么呢?!
經過查閱資料發(fā)現,原來這與runloop密切相關,在這里呢,我們主要說一下NSRunloop
runloop音譯 運行循環(huán),NSRunloop是iOS消息機制的處理模式,一個線程對應一個runloop 啟動一個app的時候 主線程中的runloop是默認被創(chuàng)建好的,而子線程中的runloop需要自己手動去創(chuàng)建
runloop的運行模式 mode主要分為以下幾類
NSDefaultRunLoopMode:默認Mode彬檀,通常主線程是在這個Mode下運行
UITrackingRunLoopMode:界面跟蹤Mode瞬女,用于ScrollView 追蹤觸摸滑動窍帝,保證界面滑動時不受其他 Mode 影響
UIInitializationRunLoopMode:在剛啟動App時第進入的第一個 Mode诽偷,啟動完成后就不再使用
NSRunLoopCommonModes:這是一個占位用的Mode坤学,不是一種真正的Mode
當scrollView滑動的時候 mode處于UITrackingRunLoopMode的狀態(tài),而默認的情況下處于NSDefaultRunLoopMode的狀態(tài),如果runloop想要切換的話,需要退出當前runloop,所以我們通常把timer放到一個runloop中,代碼如下:
NSTimer *timer = [NSTimer timerWithTimeInterval:10.0 invocation:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];