通過[nsrunloop currentrunloop]或者cfrunloopgetcurrent()可以獲取當前執行緒的runloop。
啟動乙個runloop有以下三種方法:
- (void)run;
- (void)rununtildate:(nsdate *)limitdate;
- (void)runmode:(nsstring *)mode beforedate:(nsdate *)limitdate;
這三種方式無論通過哪一種方式啟動runloop,如果沒有乙個輸入源或者timer附加於runloop上,runloop就會立刻退出。
(1) 第一種方式,runloop會一直執行下去,在此期間會處理來自輸入源的資料,並且會在nsdefaultrunloopmode模式下重複呼叫runmode:beforedate:方法;
(2) 第二種方式,可以設定超時時間,在超時時間到達之前,runloop會一直執行,在此期間runloop會處理來自輸入源的資料,並且也會在nsdefaultrunloopmode模式下重複呼叫runmode:beforedate:方法;
(3) 第三種方式,runloop會執行一次,超時時間到達或者第乙個input source被處理,則runloop就會退出。
前兩種啟動方式會重複呼叫runmode:beforedate:方法。
文件說,如果想退出runloop,不應該使用第一種啟動方式來啟動runloop。
如果runloop沒有input sources或者附加的timer,runloop就會退出。
雖然這樣可以將runloop退出,但是蘋果並不建議我們這麼做,因為系統內部有可能會在當前執行緒的runloop中新增一些輸入源,所以通過手動移除input source或者timer這種方式,並不能保證runloop一定會退出。
可以通過設定超時時間來退出runloop。
通過這種方式啟動,runloop會執行一次,當超時時間到達或者第乙個輸入源被處理,runloop就會退出。
如果我們想控制runloop的退出時機,而不是在處理完乙個輸入源事件之後就退出,那麼就要重複呼叫runmode:beforedate:,
nsrunloop *myloop = [nsrunloop currentrunloop];
myport = (nsmachport *)[nsmachport port];
[myloop addport:_port formode:nsdefaultrunloopmode];
bool islooprunning = yes; // global
while (islooprunning && [myloop runmode:nsdefaultrunloopmode beforedate:[nsdate distantfuture]]);
//關閉runloop的地方
- (void)quitloop
如果不想退出runloop可以使用第一種方式啟動runloop;
使用第二種方式啟動runloop,可以通過設定超時時間來退出;
使用第三種方式啟動runloop,可以通過設定超時時間或者使用cfrunloopstop方法來退出。
iOS 讓你認識RunLoop
1.什麼是runloop,他是幹什麼用的 runloop可以理解為cocoa下的一種訊息迴圈機制,用來處理各種訊息事件,我們在開發的時候並不需要手動去建立乙個runloop,因為框架為我們建立了乙個預設的runloop,通過 nsrunloop currentrunloop 我們可以得到乙個當前執行...
iOS 學習筆記 RunLoop基礎
如果沒有runloop int main int argc,char argv int main int argc,char argv while running return 0 cf的記憶體管理 core foundation 1.凡是帶有create copy retain等字眼的函式,建立出...
IOS 多執行緒 RUNLOOP 機制 二
二,何時使用run loop 對於輔助線程,在需要和執行緒有更多互動時,才使用run loop。比如 1 使用埠或者自定義輸入源來和其他執行緒通訊 2 使用執行緒定時器 3 cocoa中使用任何performselector.的方法 參考 table performing selectors on ...