參考文章鏈接
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,沒有實(shí)際作用。
3.
這就是多線程與runloop的關(guān)系了,每一個(gè)線程都有一個(gè)與之關(guān)聯(lián)的RunLoop,而每一個(gè)RunLoop可能會(huì)有多個(gè)Mode。CPU會(huì)在多個(gè)線程間切換來執(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ù)。