iOS多線程開發(三)---Run Loop(二,三)

來源:互聯網
上載者:User

標籤:

 

 

二,何時使用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{ BOOL done = NO; // Set up a autorelease pool here if not using garbage collection. ......... // Add Sources/Timers to the run loop  and do any other setup .........  // The cycle of run loop do { // start  the run loop but return after each source is handled SInt32 result = CFRunLoopRunInMode( kCFRunLoopDefault, 10, YES );  // if a source explicitly stopped the run loop, or if there are no sources or timers, go ahead and exit. if( (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished) ) done = YES;  // Check for any other exit conditions here and set the "done" variable as needed ......... }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對象的修改儘可能在所有線程內部完成這些操作

iOS多線程開發(三)---Run Loop(二,三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.