RunLoop是iOS開發(fā)過程中非斥珊觯基礎(chǔ)的一個概念迅矛,本文就簡單說下RunLoop妨猩,也算是自己做的一個筆記,如有不對之處請指出秽褒。
RunLoop是什么壶硅?
我們都知道一個線程在執(zhí)行完它的任務(wù)之后就會退出,那如果想要執(zhí)行完任務(wù)不退出销斟,下次有任務(wù)時線程還可以正常使用森瘪。這種模型稱之為Event Loop。實現(xiàn)這種模型的關(guān)鍵就在于如何讓它在有任務(wù)的時候處理任務(wù)票堵,沒有任務(wù)的時候進行休眠。
所以RunLoop就是一個對象逮栅,這個對象管理來需要處理的事件和消息悴势。
RunLoop_0.png
如上圖所示,RunLoop是由多個Mode組成措伐,而每個Mode又分為若干個Source/Obsever/Timer組成特纤。
每次啟用RunLoop時只能指定一種Mode。如果需要切換只能退出RunLoop侥加,然后重新啟動指定一個Mode捧存。
RunLoop的mode又哪些?
Mode一共分為5種担败,如下:
- NSDefaultRunLoopMode:默認(rèn)的Mode昔穴,通常主線程在這個Mode下運行。
- UITrackingRunLoopMode:對應(yīng)的是UI素材UIScrollView等UI控件滑動屏幕時對應(yīng)的Mode提前。
- NSRunLoopCommonModes:這是一種標(biāo)記吗货,標(biāo)記成為NSDefaultRunLoopMode和UITrackingRunLoopMode。
- UIInitializationRunLoopMode:這種是在APP啟動時進入的第一個Mode狈网,啟動完成后就不會再進入了宙搬。
- GSEventReceiveRunLoopMode:接受系統(tǒng)內(nèi)部事件的Mode,開發(fā)中用不到拓哺。
對于上面的5種Mode勇垛,后兩種沒有用到過。
RunLoop的簡單應(yīng)用
使用NSTimer時添加到runloop中
第一種士鸥,也是我們經(jīng)常直接使用的闲孤。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
使用這種的話,相當(dāng)于系統(tǒng)會自動添加到runloop中烤礁,并且對應(yīng)的Mode為NSDefaultRunLoopMode崭放,當(dāng)我們滑動UIScrollView等控件時哨苛,定時器方法就不執(zhí)行了。
第二種币砂,自行添加到runloop中建峭。
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
可以使用我們想要的Mode進行設(shè)置。