也來談談CFRunLoop(NSRunLoop)
說來,我忘東西還真是飛快。
前一個月自認為把RunLoop研究得比較透徹了,但因為沒有在專案中實際使用的緣故,到現在竟然都快忘了,我必須得把它記錄下來,以後忘記了我還可以在這裡找回來再看看。
下面是測試程式碼:
- (void)viewDidLoad { [super viewDidLoad]; //這裡偷個懶,直接使用performSelectorInBackground來建立一個執行緒,並執行configRunLoop方法 [self performSelectorInBackground:@selector(configRunLoop) withObject:nil]; UIButton* __button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [__button1 setTitle:@"Fire Event" forState:UIControlStateNormal]; //觸發事件啟動RunLoop [__button1 addTarget:self action:@selector(triggerEvent) forControlEvents:UIControlEventTouchUpInside]; __button1.frame = CGRectMake(0, 0, 100, 80); [self.view addSubview:__button1]; UIButton* __button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [__button2 setTitle:@"Stop RunLoop" forState:UIControlStateNormal]; //RunLoop週期完成後自動退出執行緒 [__button2 addTarget:self action:@selector(stopRunloop) forControlEvents:UIControlEventTouchUpInside]; __button2.frame = CGRectMake(110, 0, 120, 80); [self.view addSubview:__button2]; } - (void)stopRunloop{ _shouldStop = YES; } - (void)triggerEvent{ if (CFRunLoopIsWaiting(_runLoopRef)) { NSLog(@"RunLoop 正在等待事件輸入"); //新增輸入事件 CFRunLoopSourceSignal(_source); //喚醒執行緒,執行緒喚醒後發現由事件需要處理,於是立即處理事件 CFRunLoopWakeUp(_runLoopRef); }else { NSLog(@"RunLoop 正在處理事件"); //新增輸入事件,當前正在處理一個事件,當前事件處理完成後,立即處理當前新輸入的事件 CFRunLoopSourceSignal(_source); } } //此輸入源需要處理的後臺事件 static void fire(void* info __unused){ NSLog(@"我現在正在處理後臺任務"); sleep(5); } - (void)configRunLoop{ //這裡獲取到的已經是某個子執行緒了哦,不是主執行緒哦 _tThread = [NSThread currentThread]; //這裡也是這個子執行緒的RunLoop哦 _runLoopRef = CFRunLoopGetCurrent(); bzero(&_source_context, sizeof(_source_context)); //這裡建立了一個基於事件的源 _source_context.perform = fire; _source = CFRunLoopSourceCreate(NULL, 0, &_source_context); //將源新增到當前RunLoop中去 CFRunLoopAddSource(_runLoopRef, _source, kCFRunLoopCommonModes); while (!_shouldStop) { NSLog(@"RunLoop 開始執行"); //每次RunLoop只執行10秒,每10秒做一次檢測,如果沒有需要處理的後臺任務了,就讓此執行緒自己終止,不用暴力Kill CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, NO); NSLog(@"RunLoop 停止執行"); } _tThread = nil; }
這裡是更詳細的說明和解釋
附件是Demo的完整程式碼
相關文章
- 我也想來談談HTTPSHTTP
- 也來談談人工智慧的罪與罰人工智慧
- 外行假裝內行,我也來談談SAP BAPI和BADIAPI
- 我也 30 了,來談談程式設計師的迷茫年齡程式設計師
- 也談談全棧工程師全棧工程師
- 也談元件化元件化
- 也談敏捷(1)敏捷
- 也談敏捷(2)敏捷
- 也談團隊文化
- 也談談同源策略和跨域問題跨域
- 俺也談談 library cache lock 等待事件事件
- 我也談談這個執行力吧薦
- 也談goroutine排程器Go
- 也談程式設計改革程式設計
- 來談談限流-RateLimiter原始碼分析MIT原始碼
- 也談談規範,JS程式碼的幾個注意點JS
- 也談如何寫一個Webserver(-)WebServer
- 也談JavaScript陣列去重JavaScript陣列
- 也談TTreeView、TListView用法一二 (轉)View
- 簡單來談談Unicode與emojiUnicode
- 來談談限流-從概念到實現
- 一起來談談 Spring AOP!Spring
- 使用過JSF的人來談談感想.JS
- 《經濟學人》也談 Python:它會是我們的未來嗎?Python
- 《NSRunLoop》OOP
- 面試官:來談談限流-RateLimiter原始碼分析面試MIT原始碼
- 談一談越來越難做的前端前端
- 我來談一談 WebDAV - - AJAX - JavaEye論壇WebJava
- 也談如何寫一個Webserver(三)WebServer
- 也談SAP系統優缺點
- 也談畢姥爺視訊事件事件
- 也談如何閱讀程式原始碼原始碼
- 也談”難夠死”nagios薦iOS
- 也談 Android 中的回撥Android
- 老憤青也來說兩句,也談青年程式設計師如何進入職場 薦程式設計師
- Android 之 “只是想來談談 Handler 機制”Android
- [譯] 2018 來談談 Web ComponentWeb
- 也談談內卷化、996和程式設計師的發展996程式設計師