NSRunLoop認(rèn)識(shí)(一)

一.NSRunloop的基本認(rèn)識(shí)

  • 主線程Runlopp 從App開啟,就一直存在(在main函數(shù)中初始化). 主線程的runloop : [NSRunLoop mainRunLoop];

  • 其他線程的 Runloop, 需要開發(fā)者自己手動(dòng)去開啟 : [NSRunLoop currentRunLoop];

  • NSRunloop 既然和線程息息相關(guān), 如果線程銷毀或者 cancel , 則當(dāng)前Runloop結(jié)束工作

  • NSRunLoop是保證線程不會(huì)退出,并且能在不處理消息的時(shí)候讓線程休眠,節(jié)約資源,在接收到消息的時(shí)候喚醒線程做出對(duì)應(yīng)處理的消息循環(huán)機(jī)制

  • NSRunloop 和 當(dāng)前線程一一對(duì)應(yīng). 例如字典的 鍵值對(duì), 可比喻成:

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    dict[@"mainThread"] = @"[NSRunLoop mainRunLoop]";
    dict[@"thread1"] = @"RunLoop1";
    dict[@"thread2"] = @"RunLoop2";
    dict[@"thread3"] = @"RunLoop3";
    dict[@"thread4"] = @"RunLoop4";
    

二.NSRunloop的本質(zhì)

  • 1.NSRunloop 本質(zhì)上就是一個(gè) do - while 循環(huán)

    do {
        var message = get_next_message();
        process_message(message);
    } while (message != quit);
    
    
  • 2.如果一直存在消息, 則一直循環(huán)去處理 消息,直到消息處理完畢,才跳出循環(huán)

三.NSRunloop的最常見使用 : NSTimer

同學(xué)們都在知道 在控制器中寫入以下代碼, 那么每隔3s都會(huì)執(zhí)行一次指定的方法(這里先不考慮timer和self的引用)

NSTimer *timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(excute) userInfo:nil repeats:true];
// 將timer 注冊(cè)到 Runloop中
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

四.NSRunloop的Mode

NSDefaultRunLoopMode  : 默認(rèn)的模式
UITrackingRunLoopMode : 當(dāng)滾動(dòng)的時(shí)候會(huì)調(diào)用的模式
NSRunLoopCommonModes  : (NSDefaultRunLoopMode 和 UITrackingRunLoopMode的組合)
...
62046-20170508103511988-278243544.png
  • 1.NSRunloop中包含多個(gè) Mode ,每個(gè)Mode中包含 : Source(Source0 , Source1) Timer Observer
  • 2.每個(gè)Mode之間都是相對(duì)獨(dú)立的,當(dāng)切換Mode時(shí)必須退出當(dāng)前Mode,然后重新進(jìn)入Runloop以保證不同Mode的Source Timer Observer互不影響。
  • 3.實(shí)際運(yùn)用: NSRunLoopCommonModes 運(yùn)用的較多. 原因: 一個(gè)縱向可滾動(dòng)的scrollView上存放著3個(gè)橫向滾動(dòng)的 自動(dòng)滾動(dòng)輪播圖,如果 輪播圖中的timer添加的ModeNSDefaultRunLoopMode 或者 UITrackingRunLoopMode,那么我們手動(dòng)拉動(dòng) ScrollView時(shí), 輪播圖是靜止不動(dòng)的,因?yàn)?code>RunLoop只有一個(gè) Mode,無法進(jìn)行切換. 如果添加的是NSRunLoopCommonModes,那么當(dāng)我沒拉動(dòng)scrollView時(shí),RunLoop在這兩種Mode之間不停的切換,保證了輪播圖也可以正常滾動(dòng)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 Runloop機(jī)制原理 深入理解RunLoop http://www.cocoachina.com/ios/2...
    Kevin_Junbaozi閱讀 4,241評(píng)論 4 30
  • ======================= 前言 RunLoop 是 iOS 和 OSX 開發(fā)中非?;A(chǔ)的一個(gè)...
    i憬銘閱讀 989評(píng)論 0 4
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的,也是非常重要的, 在面試過程中是經(jīng)常會(huì)被問到的, ...
    made_China閱讀 1,273評(píng)論 0 7
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的,也是非常重要的, 在面試過程中是經(jīng)常會(huì)被問到的, ...
    SOI閱讀 22,025評(píng)論 3 63
  • 基本概念 進(jìn)程 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,而且每個(gè)進(jìn)程之間是獨(dú)立的,它們都運(yùn)行在其專用且受保護(hù)的內(nèi)存...
    小楓123閱讀 1,011評(píng)論 0 1

友情鏈接更多精彩內(nèi)容