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)單使用