Runloop 隨手記(一)

學習地址:http://www.cnblogs.com/tangbinblog/archive/2012/12/07/2807290.html

Runloop:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

中文翻譯博客:http://www.cnblogs.com/tangbinblog/archive/2012/12/07/2807290.html

http://www.cnblogs.com/scorpiozj/archive/2011/05/26/2058167.html

總結要點:

1.每個線程創建的時候,都有一個Runloop循環.
2.每個線程,包括程序的主線程都與之對應的run loop Object.只有輔助線程才需要顯式的運行它的run loop.在Cocoa程序中,主線程會主動創建并運行它run loop;

3.Run loop,是一個循環,你的線程進入,并使用它來運行響應輸入事件的事件處理.也就是說,代碼要提供實現循環的控制語句.換言之就是要有whlie或for循環語句來驅動run loop.在你的循環中,使用run loop object來運行事件處理的代碼.它響應接受到得事件并啟動已經安裝的處理程序.>

Run Loop模式
Run Loop 模式是所有要監視的輸入源和定時源以及要通知的run loop注冊觀察者的集合.每次運行你的run Loop,你都要指定(無論顯式還是隱式)其運行模式.

在Run Loop運行過程中,只有和模式相關的源才會被監視,并允許他們傳遞事件消息.
模式可以被指定任意名字,但是模式的內容則不能是任意的.必須添加一個或多個輸入源,定時源或者runloop 的觀察者到你新建的模式中讓他有價值,

注意:模式區分基于事件的源而非事件的種類。例如,你不可以使用模式只選擇處理鼠標按下或者鍵盤事件。你可以使用模式監聽端口,暫停定時器或者改變其他源或者當前模式下處于監聽狀態run loop觀察者。
**

輸入源的種類:基于端口的輸入源和自定義輸入源.
基于端口的輸入源監聽程序相應的端口。自定義輸入源則監聽自定義的事件源。

自定義輸入源:必須使用Core Foundation里面的CFRunLoopSourceRef類型相關的函數來創建。你可以使用回調函數來配置自定義輸入源。Core Fundation會在配置源的不同地方調用回調函數,處理輸入事件,在源從run loop移除的時候清理它。

筆記:
1.runloop 的作用:使程序一直運行并接受用戶輸入
決定程序在何時應該處理哪些Event
調用解耦(Message Queue) 調用和被調用這之間 通過線程隊列去交互
節省CPU時間
相關類
NSTimer UIEvent Autorelease NSObject NSdelayedPerforimg NSthreadPerformAddition
CADisplayLintk CATransition CAAnimation
dispathch_get_main_queue()
NSURLConnection AFNetworking

RunLoop在同一時間只能必須在一中特定的Mode下Run
更換Mode時候,需要停止當前的Loop,然后重啟新的Loop
NSRunloop 的model
NSDefaultRunLoopMode 默認狀態,空閑狀態
UITrackingRunLoopMode 滑動ScrollView時,追蹤UI 變化的的模式
UIinitializationRunLoopMode 私有,
NSRunLoopCommonModes (兩種模式 NSDefaultRunLoopMode和UITrackingRunLoopMode)

舉一個例子:下面的timer 添加到NSDefaultRunLoopMode

[NSTimer scheduledTimerWithTimeInterval:1.0
                                 target:self
                               selector:@selector(timerTick:)
                               userInfo:nil
                                repeats:YES];

在滑動UIScrollview 時候會切換到 UITrackingRunLoopMode 模式 NSTimer 就會失效

修改:

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0
                                         target:self
                                       selector:@selector(timerTick:)
                                       userInfo:nil
                                        repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

創建一個等待空閑的線程的事例

+ (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;
}

+ (void)networkRequestThreadEntryPoint:(id)__unused object {
@autoreleasepool {
    [[NSThread currentThread] setName:@"AFNetworking"];
    
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    [runLoop run];
 }
}

//runloop 開啟,一直監聽MachPort 消息,線程一直存活.

解決,在滑動的時候是否去設置image ,在滑動的UITableview的時候,同時設置image的,都在主線程操作,就會出現卡頓,(視頻上是這樣解決的,如果因為UI主線程繁忙的時候,造成的阻塞,可以調用(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait )

UIImage *downloadedImage = ...;
[self.avatarImageView performSelector:@selector(setImage:)
                           withObject:downloadedImage
                           afterDelay:0
                              inModes:@[NSDefaultRunLoopMode]];

解決的角度,一個是在RooLoop的模式角度.一個是主線程的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容