2018-10-15

NSTimer與RunLoop的關(guān)系
  • 什么是NSTimer
    NSTimer 官方的概念意思是:計(jì)時(shí)器提供執(zhí)行延遲動(dòng)作或定期動(dòng)作的方法。 計(jì)時(shí)器等待直到經(jīng)過(guò)一定的時(shí)間間隔然后觸發(fā),向指定的對(duì)象發(fā)送指定的消息。是指一個(gè)能從某個(gè)時(shí)刻周期性的執(zhí)行我們方法的對(duì)象。
  • 什么是RunLoop
    RunLoop是iOS事件響應(yīng)與任務(wù)處理最核心的機(jī)制,它貫穿iOS整個(gè)系統(tǒng)。
    RunLoop是一種事件運(yùn)行循環(huán)機(jī)制,是保持應(yīng)用程序持續(xù)運(yùn)行的一種機(jī)制。正是由于該機(jī)制的存在,應(yīng)用程序才能在沒(méi)有事件發(fā)生的時(shí)候處于休眠狀態(tài),有事件發(fā)生的時(shí)候處于工作狀態(tài)。以此來(lái)節(jié)約CPU資源。這也是它的一大特點(diǎn)。
  • RunLoop和線程的關(guān)系:
    RunLoop是用來(lái)管理線程的,每個(gè)線程對(duì)應(yīng)一個(gè)RunLoop對(duì)象。我們不可以去創(chuàng)建當(dāng)前線程的RunLoop對(duì)象,但是我們可以去獲取當(dāng)前線程的RunLoop。RunLoop就是來(lái)監(jiān)聽(tīng)該線程有無(wú)事件發(fā)生,如果有就工作,如果沒(méi)有就休眠。
    主線程的RunLoop對(duì)象默認(rèn)開(kāi)啟,其他線程默認(rèn)不開(kāi)啟。
  • 1.Runloop和線程的關(guān)系:一個(gè)Runloop對(duì)應(yīng)著一條唯一的線程。 2.Runloop的創(chuàng)建:主線程Runloop已經(jīng)創(chuàng)建好了,子線程的runloop需要手動(dòng)創(chuàng)建。
    3.Runloop的生命周期:在第一次獲取時(shí)創(chuàng)建,在線程結(jié)束時(shí)銷毀。
NSTimer與Runloop的關(guān)系
  • 在我們進(jìn)行多線程編程時(shí),所有的Source都需要添加到Runloop中才能生效,對(duì)于我們的NSTimer當(dāng)然也需要添加到Runloop中才能生效。如果一個(gè)Runloop中沒(méi)有任何Source的話,會(huì)立即退出的。而主線程的Runloop在程序運(yùn)行時(shí),系統(tǒng)就已經(jīng)為我們添加了很多Source到Runloop中,所以主線程的Runloop是一直存在的。

  • NSTimer添加到Runloop中,但是不運(yùn)行。

    在iOS多線程中,每一個(gè)線程都有一個(gè)Runloop,但是只有主線程的Runloop默認(rèn)是打開(kāi)的,其他子線程也就是我們創(chuàng)建的線程的Runloop默認(rèn)是關(guān)閉的,需要我們手動(dòng)運(yùn)行。

  • NSTimer 創(chuàng)建的兩種方式

    第一種:
    NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(clickOnTimer) userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    第二種:
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(clickOnTimer) userInfo:nil repeats:YES];

  • 獲得Runloop對(duì)象:

    1.獲得當(dāng)前Runloop對(duì)象:
    a. NSRunloop
    NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];
    b.CFRunLoopRef
    CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
    2.拿到當(dāng)前應(yīng)用程序的主Runloop(主線程對(duì)應(yīng)的Runloop)
    a.NSRunloop
    NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];
    b.CFRunLoopRef
    CFRunLoopRef runloop2 = CFRunLoopGetMain();

  • NSTimer 和 RunLoop 的簡(jiǎn)單使用

    https://blog.csdn.net/crazyduang/article/details/52582858

?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • | 此文獻(xiàn)給我的母上大人 | 昨天是母親節(jié),五月的第二個(gè)星期天。 朋友圈里從昨天開(kāi)始就一直被母親節(jié)刷屏了。 其實(shí)在...
    阿瓶姑娘閱讀 355評(píng)論 0 4
  • 鄭璐 宜昌 焦點(diǎn)網(wǎng)絡(luò)初級(jí)七期 原創(chuàng)持續(xù)分享第39天 今天周末,兒子跟奶奶去外地吃喜酒去了,我跟老公各忙各的,他...
    迷你旅客閱讀 152評(píng)論 0 0
  • 文/雨隨塵清 日子過(guò)的真快,短暫的假期,時(shí)間邁著輕快的腳步,悄悄的走到了盡頭。 離開(kāi)前的一刻,一切都還是那么的近,...
    清陋閱讀 401評(píng)論 11 21

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