RunLoop理解

1.RunLoop概念
是一個讓線程能隨時處理事件但是不退出的機制多矮,它是一個對象耙册,這個對象管理了其需要處理的事件和消息,并且提供了一個入口函數(shù),線程執(zhí)行了這個函數(shù)以后躏吊,就會處于這個函數(shù)內(nèi)部 接收消息,等待赤屋,處理的循環(huán)中园骆,這個這個循環(huán)結(jié)束,函數(shù)返回津滞。
2.RunLoop與線程的關系
蘋果不允許直接創(chuàng)建 RunLoop铝侵,它只提供了兩個自動獲取的函數(shù):CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。
可以看出触徐,線程和RunLoop是一一對應的咪鲜,其關系是保存在一個全局的Dictionary中,線程創(chuàng)建的時候沒有RunLoop撞鹉,你如果不獲取疟丙,它就一直沒有,RunLoop的創(chuàng)建是在第一次獲取的時候孔祸,RunLoop的銷毀是在線程結(jié)束的時候隆敢,所以你只能在一個線程內(nèi)部獲取其RunLoop(主線程除外)

3.RunLoop 的 Mode
蘋果公開提供的 Mode 有兩個:
1 NSDefaultRunLoopMode(kCFRunLoopDefaultMode)默認,空閑狀態(tài)
2 UITrackingRunLoopMode ScrollView滑動時

同時蘋果還提供了一個操作 Common 標記的字符串:kCFRunLoopCommonModes (NSRunLoopCommonModes)崔慧,你可以用這個字符串來操作 Common Items拂蝎,或標記一個 Mode 為 “Common”。使用時注意區(qū)分這個字符串和其他 mode name

RunLoop其內(nèi)部是一個 do-while 循環(huán)惶室。當你調(diào)用 CFRunLoopRun() 時温自,線程就會一直停留在這個循環(huán)里;直到超時或被手動停止皇钞,該函數(shù)才會返回悼泌。

4.AFNetworking

+ (void)networkRequestThreadEntryPoint:(id)__unused object {
    @autoreleasepool {
        [[NSThread currentThread] setName:@"AFNetworking"];
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}
 
+ (NSThread *)networkRequestThread {
    static NSThread *_networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [_networkRequestThread start];
    });
    return _networkRequestThread;
}

RunLoop 啟動前內(nèi)部必須要有至少一個 Timer/Observer/Source,所以 AFNetworking 在 [runLoop run] 之前先創(chuàng)建了一個新的 NSMachPort 添加進去了夹界。通常情況下馆里,調(diào)用者需要持有這個 NSMachPort (mach_port) 并在外部線程通過這個 port 發(fā)送消息到 loop 內(nèi);但此處添加 port 只是為了讓 RunLoop 不至于退出,并沒有用于實際的發(fā)送消息鸠踪。

- (void)start {
    [self.lock lock];
    if ([self isCancelled]) {
        [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
    } else if ([self isReady]) {
        self.state = AFOperationExecutingState;
        [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
    }
    [self.lock unlock];
}

當需要這個后臺線程執(zhí)行任務時丙者,AFNetworking 通過調(diào)用 [NSObject performSelector:onThread:..] 將這個任務扔到了后臺線程的 RunLoop 中。

保持RunLoop不退出的方法啟動前內(nèi)部必須要有至少一個 Timer/Observer/Source营密,AFNetworking中是持有一個NSMachPort械媒,而SRWebSocket中是用dispatch_group_wait和dispatch_group_leave,單獨創(chuàng)建一個NSRunLoop的分類

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末评汰,一起剝皮案震驚了整個濱河市纷捞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌被去,老刑警劉巖主儡,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異编振,居然都是意外死亡缀辩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門踪央,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臀玄,“玉大人,你說我怎么就攤上這事畅蹂〗∥蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵液斜,是天一觀的道長累贤。 經(jīng)常有香客問我,道長少漆,這世上最難降的妖魔是什么臼膏? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮示损,結(jié)果婚禮上渗磅,老公的妹妹穿的比我還像新娘。我一直安慰自己检访,他們只是感情好始鱼,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脆贵,像睡著了一般医清。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卖氨,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天会烙,我揣著相機與錄音负懦,去河邊找鬼。 笑死持搜,一個胖子當著我的面吹牛密似,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葫盼,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼村斟!你這毒婦竟也來了贫导?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蟆盹,失蹤者是張志新(化名)和其女友劉穎孩灯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逾滥,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡峰档,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寨昙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讥巡。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舔哪,靈堂內(nèi)的尸體忽然破棺而出欢顷,到底是詐尸還是另有隱情,我是刑警寧澤捉蚤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布抬驴,位于F島的核電站,受9級特大地震影響缆巧,放射性物質(zhì)發(fā)生泄漏布持。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一陕悬、第九天 我趴在偏房一處隱蔽的房頂上張望题暖。 院中可真熱鬧,春花似錦墩莫、人聲如沸芙委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灌侣。三九已至,卻和暖如春裂问,著一層夾襖步出監(jiān)牢的瞬間侧啼,已是汗流浹背牛柒。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痊乾,地道東北人皮壁。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像哪审,于是被迫代替她去往敵國和親蛾魄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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