參考文章鏈接
http://blog.ibireme.com/2015/05/18/runloop/
1.UITrackingRunLoopModes模式下沽一,不會(huì)處理定時(shí)事件肚逸。所以再滾動(dòng)列表的時(shí)候,定時(shí)器會(huì)停止。
NSTimer*timer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(test)userInfo:nilrepeats:YES];
//[[NSRunLoopcurrentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; ?//注釋掉這句定時(shí)器不響應(yīng)
}
-(void)test{NSLog(@"輸出你妹");}
2.系統(tǒng)默認(rèn)注冊(cè)了5個(gè)Mode:
1. kCFRunLoopDefaultMode: App的默認(rèn) Mode简卧,通常主線程是在這個(gè) Mode 下運(yùn)行的。
2. UITrackingRunLoopMode: 界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動(dòng)莱没,保證界面滑動(dòng)時(shí)不受其他 Mode 影響。
3. UIInitializationRunLoopMode: 在剛啟動(dòng) App 時(shí)第進(jìn)入的第一個(gè) Mode酷鸦,啟動(dòng)完成后就不再使用饰躲。
4: GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode牙咏,通常用不到。
5: kCFRunLoopCommonModes: 這是一個(gè)占位的 Mode嘹裂,沒(méi)有實(shí)際作用妄壶。
3.
這就是多線程與runloop的關(guān)系了,每一個(gè)線程都有一個(gè)與之關(guān)聯(lián)的RunLoop寄狼,而每一個(gè)RunLoop可能會(huì)有多個(gè)Mode丁寄。CPU會(huì)在多個(gè)線程間切換來(lái)執(zhí)行任務(wù),呈現(xiàn)出多個(gè)線程同時(shí)執(zhí)行的效果泊愧。執(zhí)行的任務(wù)其實(shí)就是RunLoop去各個(gè)Mode里執(zhí)行各個(gè)item伊磺。因?yàn)镽unLoop是獨(dú)立的兩個(gè),相互不會(huì)影響拼卵,所以在子線程添加timer奢浑,滑動(dòng)視圖時(shí),timer能正常運(yùn)行腋腮。
總結(jié)
1雀彼、如果是在主線程中運(yùn)行timer,想要timer在某界面有視圖滾動(dòng)時(shí)即寡,依然能正常運(yùn)轉(zhuǎn)徊哑,那么將timer添加到RunLoop中時(shí),就需要設(shè)置mode 為NSRunLoopCommonModes聪富。
2莺丑、如果是在子線程中運(yùn)行timer,那么將timer添加到RunLoop中后,Mode設(shè)置為NSDefaultRunLoopMode或NSRunLoopCommonModes均可墩蔓,但是需要保證RunLoop在運(yùn)行梢莽,且其中有任務(wù)。