NSRunloop的簡單認識

2021-06-29 15:53:33 字數 1828 閱讀 4865

最早接觸runloop的概念,是第一次用nstimer的時候。乙個最簡單的例子:

- (void)viewdidload

如果我們同時在介面上滾動乙個scrollview,那麼我們會發現在滾動停止之前,控制台是不會有輸出的,就好像scrollview在滾動的時候將timer暫停了一樣。通過了解後發現,其實是cocoa的runloop mode在作怪。

我把runloop理解為一種cocoa下的一種訊息迴圈的機制,用來處理各種訊息事件。我們在開發的時候一般並不需要手動去建立乙個runloop,因為在程式進入mainthread之後其實就為我們建立了預設的的mainrunloop,通過[nsrunloop currentrunloop]我們就可以得到當前執行緒對應的runloop物件,而我們需要留意的是在多個runloop之間訊息的通知方式。

接上面說到的,開啟乙個nstimer實質上是開啟了乙個新的執行緒(runloop)在當前runloop中註冊了乙個新的事件源,也就是說除了mainrunloop之外還有乙個runloop存在。而當scrollview在滾動的時候,當前mainrunloop是處於uitrackingrunloopmode,在該模式下,不會處理 nsdefaultrunloopmode的訊息(因為runloop model不一致),而nstimer在建立後的runloop(b)缺省會以nsdefaultrunloopmode與當前context的runloop(a)傳送訊息進行通訊。要想在scrollview滾動的同時也接受其他runloop的訊息,則需要改變兩者之間的runloopmode

[[nsrunloop currentrunloop] addtimer:timer

formode:nsrunloopcommonmodes];

類似的問題在前幾天修改乙個http非同步通訊模組的時候也碰到了,簡單地說是向伺服器非同步獲取資料後通知主線程重新整理tableview中的,但在tableview滾動還沒有停止或使用者手指還停留在螢幕上的時候,一直不會出來。後來發現請求資料的時候用到了nsurlconnection的

- (id)initwithrequest:(nsurlrequest *)request 

delegate:(id)delegate;

了解後發現該方法建立的非同步請求執行緒和nstimer一樣,也是nsdefaultrunloopmode的,與

- (id)initwithrequest:(nsurlrequest *)request 

delegate:(id)delegate

startimmediately:(bool)startimmediately

不同的是,上面的方法預設建立後預設直接發起請求,並以nsdefaultrunloopmode與runloop進行訊息傳遞,因此我們需要和nstimer一樣更改他的runloopmode。

nsurlconnection *connection = [[nsurlconnection alloc]

initwithrequest:request

delegate:self

startimmediately:no];

[connection scheduleinrunloop:[nsrunloop currentrunloop]

formode:nsrunloopcommonmodes];

[connection start];

NSRunloop 簡單細說

nsrunloop簡單細說 一 整體了解 nsrunloop簡單細說 二 獲取執行迴圈及其模式 nsrunloop簡單細說 三 定時器和埠 nsrunloop簡單細說 四 開啟runloop nsrunloop簡單細說 五 排程和取消訊息 nsrunloop簡單細說 六 幾種迴圈模式詳細解析 nsr...

this簡單認識

this 在函式中簡單的說,this的指向存在於函式呼叫的時候決定的,誰呼叫了這函式 函式中的this就指向誰 例如 1 普通的呼叫函式的時候 fn window2 物件呼叫 var obj obj.f fn obj.f this obj3 定時器呼叫 因為fn不是我們自己手寫 呼叫的 底層是win...

Socket的簡單認識

socket又稱 套接字 網路上的兩個程式通過乙個 雙向的通訊連線實現資料的交換 這個連線的一端稱為乙個 socket。應用程式通常通過 套接字 向網路發出請求或者應答網路請求 網路通訊的要素 網路上的請求就是通過 socket 來建立連線然後互相通訊 ip位址 網路上主機裝置的 唯一標識 埠號 定...