IOS 多執行緒 RUNLOOP 機制 二

2021-06-18 02:00:43 字數 1799 閱讀 9503

二,何時使用run loop

對於輔助線程,在需要和執行緒有更多互動時,才使用run loop。

比如:1)使用埠或者自定義輸入源來和其他執行緒通訊

2)使用執行緒定時器

3)cocoa中使用任何performselector...的方法(參考

table:

performing selectors on other threads)

4)使執行緒週期性工作

三,如何使用run loop物件

run loop物件提供了

新增輸入源,定時器和run loop的觀察者以及啟動run loop的介面,使用run loop包活獲取--配置--啟動--退出四個過程

1,獲取run loop的物件

a,通過nsrunloop獲取

// 獲得當前thread的run loop

nsrunloop *myrunloop = [

nsrunloop currentrunloop];

// 將cocoa的nsrunloop型別轉換程core foundation的cfrunloopref型別

cfrunloopref ç = [myrunloop getcfrunloop];

b,使用cfrunloopgetcurrent()函式

2,配置run loop

所謂配置run loop主要是給run loop新增輸入源,定時器或者新增觀察者,即設定run loop模式。上面函式

- (void)observerrunloop就是配置了乙個帶有觀察者,新增了乙個定時器的run loop執行緒。相關物件---cfrunloopobserverref物件和cfrunloopaddobserver函式

3,啟動run loop

乙個run loop通常必須包含乙個輸入源或者定時器來監聽事件,如果乙個都沒有,run loop啟動後立即退出。

啟動run loop的方式

1)無條件的---最簡單的啟動方法,但是退出run loop的唯一方式就是殺死它。

2)設定超時時間---預設超時時間來執行run loop。run loop執行直到某一事件到達或者規定的時間已經到期。

a,如果是事件到達,訊息被傳遞給相應的處理程式來處理,然後run loop退出。可以迴圈重啟run loop來等待下一事件。

b,如果是規定的時間到期了,可以使用此段時間來做任何的其他工作,然後run loop退出,或者直接迴圈重啟run loop。

3)特定模式

使用特定模式執行run loop

=====running a run loop: skeleton

- (void)skeletonthreadmain

while(!done)

// clean up code here. be sure to release any allocated autorelease pools

......... }

注:可以遞迴執行run loop,即可以使用cfrunlooprun,cfrunloopruninmode或者任一nsrunloop的方法在

輸入源或者定時器的處理程式裡面啟動run loop

4,退出run loop

有兩種方法可以讓run loop在處理事件之前退出

a,給run loop設定超時時間

b,通知run loop停止---使用cfrunloopstopped函式可以顯式停止run loop

5,執行緒安全和run loop物件

nsrunloop執行緒不安全

cfrunloop執行緒安全

對run loop物件的修改盡可能在所有執行緒內部完成這些操作

多執行緒篇 RunLoop

簡述 1 runloop是事件接收和分發機制的乙個實現 3 以及節省cpu資源,提高程式效能 該做事時做事,該休息時休息 如何獲取runloop物件 這裡的話ios提供了兩套api來訪問或使用runloop 1 cfrunloopref 是在 corefoundation 框架內的,它提供了純 c ...

RunLoop機制理解

一 淺識runloop runloop在開發中我們一直在用,但是沒有注意他。要想理解runloop,首先我們需要先了解一下程式執行機制。二 runloop與執行緒的關係 runloop是用來管理執行緒的。每乙個執行緒都有乙個runloop物件。可以通過具體的方法去獲得。但是需要注意 雖然每乙個執行緒...

多執行緒學習筆記4 RunLoop

基本作用 runloop處理邏輯 官方版 runloop物件 ios中有2套api來訪問和使用runloop core foundation nsrunloop和cfrunloopref都代表著runloop物件 nsrunloop是基於cfrunloopref的一層oc包裝,所以要了解runloo...