通常所說(shuō)的RunLoop指的是NSRunloop或者CFRunloopRef,CFRunloopRef是純C的函數(shù)壁肋,而NSRunloop僅僅是CFRunloopRef的OC封裝,并未提供額外的其他功能卜范。
核心的方法__CFRunLoopRun內(nèi)部其實(shí)是一個(gè)do while循環(huán)帆调,這也正是Runloop運(yùn)行的本質(zhì)激挪。執(zhí)行了這個(gè)函數(shù)以后就一直處于“等待-處理”的循環(huán)之中,直到循環(huán)結(jié)束橘蜜。只是不同于我們自己寫(xiě)的循環(huán)它在休眠時(shí)幾乎不會(huì)占用系統(tǒng)資源菊匿,當(dāng)然這是由于系統(tǒng)內(nèi)核負(fù)責(zé)實(shí)現(xiàn)的,也是Runloop精華所在。
蘋(píng)果并沒(méi)有提供直接創(chuàng)建runloop的接口跌捆,如果需要使用Runloop通常CFRunLoopGetMain()和CFRunLoopGetCurrent()兩個(gè)方法來(lái)獲取徽职。
實(shí)只有當(dāng)我們使用線(xiàn)程的方法主動(dòng)get Runloop時(shí)才會(huì)在第一次創(chuàng)建該線(xiàn)程的Runloop,同時(shí)將它保存在全局的Dictionary中佩厚。
iOS開(kāi)發(fā)過(guò)程中對(duì)于開(kāi)發(fā)者而言更多的使用的是NSRunloop,它默認(rèn)提供了三個(gè)常用的run方法:
- (void)run;
- (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;
- (void)runUntilDate:(NSDate *)limitDate;
RunLoop使用:
- NSTimer的使用
使用scheduledTimerWithTimeInterval創(chuàng)建NSTimer的話(huà)姆钉,會(huì)自動(dòng)以默認(rèn)模式NSDefaultRunLoopMode添加到當(dāng)前線(xiàn)程的RunLoop中。
如果不想NSTimer受到UI組件或者動(dòng)畫(huà)的影響可款,就把NSTimer的mode設(shè)置為NSRunLoopCommonModes育韩。