版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.22 |
前言
NSRunloop
是OC Foundation
框架中非常重要的一個類声登,很多時候我們會使用它,但是未必對其有深入的了解帐萎,接下來幾篇我就會帶著大家重新學(xué)習(xí)一下NSRunloop
這個類,從簡單到復(fù)雜,從基本到深化脖母,我會一步步的走完。希望對大家有所幫助闲孤。感興趣的可以看我上一篇谆级。
1. NSRunloop簡單細(xì)說(一)—— 整體了解
2. NSRunloop簡單細(xì)說(二)—— 獲取運(yùn)行循環(huán)及其模式
一、- (void)addTimer:(NSTimer *)timer forMode:(NSRunLoopMode)mode;
這個方法我們經(jīng)常用讼积,其實(shí)就是將定時器加入到runloop中肥照,才能開啟定時器。
下面我們看一下參數(shù):
- timer :實(shí)例化的定時器對象勤众。
- 添加定時器的模式舆绎。 您可以指定自定義模式或使用運(yùn)行循環(huán)模式
Run Loop Modes
中列出的其中一種模式。
下面看一個例子
- (void)demoAddTimer
{
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"A");
}];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
看一下輸出結(jié)果
2017-08-23 12:20:57.584335+0800 JJOC[11019:5299493] A
2017-08-23 12:20:59.584386+0800 JJOC[11019:5299493] A
2017-08-23 12:21:01.584310+0800 JJOC[11019:5299493] A
2017-08-23 12:21:03.584310+0800 JJOC[11019:5299493] A
2017-08-23 12:21:05.584304+0800 JJOC[11019:5299493] A
2017-08-23 12:21:07.584378+0800 JJOC[11019:5299493] A
還有幾點(diǎn)需要注意:
- 可以向多種輸入模式添加定時器们颜。 當(dāng)以指定模式運(yùn)行時吕朵,接收器使計時器在預(yù)定日期到達(dá)時或之后觸發(fā)猎醇。 觸發(fā)時,定時器調(diào)用其相關(guān)聯(lián)的處理程序例程努溃,它是指定對象上的選擇器硫嘶。
- 要從其安裝的所有運(yùn)行環(huán)路模式中刪除定時器,請向定時器發(fā)送無效
invalidate
消息梧税。 - 這里定時器加入runloop的模式選擇的是NSDefaultRunLoopMode沦疾,一般情況下是沒有問題的,但是在一些情況下是有問題的贡蓖,比如說滑動界面定時器停止等曹鸠,這個解決方法就是更換模式為
NSRunLoopCommonModes
。 - 還有這個問題斥铺,我這里調(diào)用的這個方法是ios 10.0以后才有的彻桃,所以如果你適配8.0系統(tǒng)的話就不能用這個方法了,應(yīng)該用
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
這個方法晾蜘,還有個問題就是如果用上面那個block
的方法還要注意循環(huán)引用的問題邻眷。
結(jié)論:這個很常用,大家需要謹(jǐn)記剔交。
二肆饶、- (void)addPort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;
該方法的作用就是:將端口作為輸入源添加到運(yùn)行循環(huán)的指定模式。其實(shí)就是往RunLoop的 Mode 中添加一個source1任務(wù)岖常。
下面看一下參數(shù):
- aPort:要加入的端口驯镊。
- mode:運(yùn)行循環(huán)模式,還是那幾種竭鞍,前面已經(jīng)說過了板惑,這里就不多說了。
我們在AFNetworking
中就看到了這個方法的使用偎快,如下所示:
+ (void)networkRequestThreadEntryPoint:(id)__unused object
{
@autoreleasepool {
[[NSThread currentThread] setName:@"AFNetworking"];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
這里冯乘,開啟了一個線程,同時開啟runloop晒夹,并添加了一個port事件維系runloop 的運(yùn)行裆馒,但是port并不發(fā)送時機(jī)的消息。這個線程是AFNetWorking用于將NSURLConection置于后臺處理請求和回調(diào)的丐怯。不過現(xiàn)在NSURLConection
已經(jīng)被該框架所廢棄了喷好。大家知道這個用法和使用情況就可以了,其實(shí)編程思想比代碼實(shí)現(xiàn)要重要的多响逢。
下面還要注意:
- 此方法使用接收器調(diào)度端口绒窑。 您可以將端口添加到多種輸入模式。 當(dāng)接收器以指定的模式運(yùn)行時舔亭,它會將發(fā)往該端口的消息分派到端口的指定處理程序些膨。
結(jié)論:思路很重要蟀俊,需要大家思考。
三订雾、- (void)removePort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;
其實(shí)肢预,只要你看過上面那個方法,那么這個方法的作用就很明顯了洼哎,該方法的作用:從運(yùn)行循環(huán)的指定輸入模式中刪除端口烫映。這里就不多說參數(shù)什么的了,同上所示即可噩峦。
這里锭沟,還有幾點(diǎn)需要注意:
- 如果您將端口添加到多個輸入模式,則必須分別從每個模式中刪除它识补。
結(jié)論:同上族淮。
參考文章
后記
未完,待續(xù)~~~~