iOS開發 RunLoop的退出方式

2021-08-10 11:42:29 字數 1607 閱讀 2140

通過[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 ...