NSRunloop簡單細(xì)說(三)—— 定時器和端口

版本記錄

版本號 時間
V1.0 2017.08.22

前言

NSRunloopOC 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é)論:同上族淮。

參考文章

1. iOS RunLoop了解和使用

后記

未完,待續(xù)~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凭涂,一起剝皮案震驚了整個濱河市祝辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌切油,老刑警劉巖蝙斜,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澎胡,居然都是意外死亡孕荠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門攻谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岛琼,“玉大人,你說我怎么就攤上這事巢株。” “怎么了熙涤?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵阁苞,是天一觀的道長。 經(jīng)常有香客問我祠挫,道長那槽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任等舔,我火速辦了婚禮骚灸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慌植。我一直安慰自己甚牲,他們只是感情好义郑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丈钙,像睡著了一般非驮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雏赦,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天劫笙,我揣著相機(jī)與錄音,去河邊找鬼星岗。 笑死填大,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俏橘。 我是一名探鬼主播允华,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敷矫!你這毒婦竟也來了例获?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤曹仗,失蹤者是張志新(化名)和其女友劉穎榨汤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎茫,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡收壕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轨蛤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜宪。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祥山,靈堂內(nèi)的尸體忽然破棺而出圃验,到底是詐尸還是另有隱情,我是刑警寧澤缝呕,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布澳窑,位于F島的核電站,受9級特大地震影響供常,放射性物質(zhì)發(fā)生泄漏摊聋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一栈暇、第九天 我趴在偏房一處隱蔽的房頂上張望麻裁。 院中可真熱鬧,春花似錦、人聲如沸煎源。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薪夕。三九已至脚草,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間原献,已是汗流浹背馏慨。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姑隅,地道東北人写隶。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓慕趴,卻偏偏與公主長得像冕房,于是被迫代替她去往敵國和親耙册。 傳聞我的和親對象是個殘疾皇子详拙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 翻譯來源: RunLoops Run Loops RunLoops是與線程緊密相關(guān)的基礎(chǔ)架構(gòu)的一部分斑粱,簡稱運(yùn)行循環(huán)...
    AlexCorleone閱讀 564評論 0 1
  • ======================= 前言 RunLoop 是 iOS 和 OSX 開發(fā)中非程;拢基礎(chǔ)的一個...
    i憬銘閱讀 871評論 0 4
  • 1.不開啟RunLoop的線程在遇到一些耗時操作時守屉,為了避免主線程阻塞導(dǎo)致界面卡頓,影響用戶體驗(yàn)思灌,往往我們會把這些...
    shinedada閱讀 368評論 0 2
  • 基本概念 進(jìn)程 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個應(yīng)用程序,而且每個進(jìn)程之間是獨(dú)立的耗跛,它們都運(yùn)行在其專用且受保護(hù)的內(nèi)存...
    小楓123閱讀 889評論 0 1
  • RunLoop 文章目錄 RunLoop簡介 1.1 什么是RunLoop惠猿? 1.2 RunLoop和線程 1.3...
    May_d8f1閱讀 281評論 0 1