ios - run loop (timer)

來源:互聯網
上載者:User

ios - run loop (timer)

在ios開發多線程程式的時候,往往會碰到run loop。

對於run loop, 蘋果開發網站上有非常詳細的說明,www.bkjia.com

強烈建議啃下來,不要怕英文。

copy了一片:

這裡就寫個Timer sources的簡單例子。

系統建立一個線程的時候,就已經預設建立了一個run loop了,除了主線程預設run loop就是啟動並執行,其他的輔助線程雖說已經建立了run loop但是並沒有運行。

 

擷取線程的run loop對象

 

    NSRunLoop* loop = [NSRunLoop currentRunLoop];
通過上面簡單的代碼就可以擷取當前線程的run loop對象。

 

 

建立一個定時器

 

    // Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doFireTimer:) userInfo:nil repeats:YES];
doFireTimer每0.1秒會被調用一次。簡單如下:

 

 

- (void) doFireTimer:(NSTimer *)timer{    NSLog(@doFireTimer, %f, timer.timeInterval);}

啟動run loop

 

 

    NSInteger loopCount = 2;    do    {        // 啟動當前thread的run loop直到所指定的時間到達,在run loop運行時,run loop會處理所有來自與該run loop聯絡的input sources的資料        // 對於本例與當前run loop聯絡的input source只有Timer類型的source        // 該Timer每隔0.1秒發送觸發時間給run loop,run loop檢測到該事件時會調用相應的處理方法(doFireTimer:)        // 由於在run loop添加了observer,且設定observer對所有的run loop行為感興趣        // 當調用runUntilDate方法時,observer檢測到run loop啟動並進入迴圈,observer會調用其回呼函數,第二個參數所傳遞的行為時kCFRunLoopEntry        // observer檢測到run loop的其他行為並調用回呼函數的操作與上面的描述相類似        [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow: 0.2]];        // 當run loop的已耗用時間到達時,會退出當前的run loop,observer同樣會檢測到run loop的退出行為,並調用其回呼函數,第二個參數傳遞的行為是kCFRunLoopExit.        --loopCount;    }while(loopCount);

調用runUntilDate函數,這個函數會使當前的run loop運行0.2秒。這裡總共調用2次。

 

因為定時器每隔0.1秒發送一個訊息,這樣每次runUntilDate應該會接受到2次訊息。(把0.2改成0.21啥的,應該就是2次,0.2的話還不一定,因為當發送第二次定時器的時候,run loop生命週期也剛剛到,可能第二次不一定能被處理)。

大致的流程就是

1. 定時器發送訊息,每隔0.1秒

2. run loop收到訊息,調用doFireTimer函數。

運行如下:可以從左邊的調用棧裡面看到doFireTimer是從run loop裡面調用的。

 

完整代碼如下:只要在主線程裡面啟動這個線程就可以了。

[NSThread detachNewThreadSelector:@selector(MyThread) toTarget:self withObject:nil];

 

- (void) doFireTimer:(NSTimer *)timer{    NSLog(@doFireTimer, %f, timer.timeInterval);}- (void) MyThread{    NSRunLoop* loop = [NSRunLoop currentRunLoop];        // Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doFireTimer:) userInfo:nil repeats:YES];    NSInteger loopCount = 2;    do    {        // 啟動當前thread的run loop直到所指定的時間到達,在run loop運行時,run loop會處理所有來自與該run loop聯絡的input sources的資料        // 對於本例與當前run loop聯絡的input source只有Timer類型的source        // 該Timer每隔0.1秒發送觸發時間給run loop,run loop檢測到該事件時會調用相應的處理方法(doFireTimer:)        // 由於在run loop添加了observer,且設定observer對所有的run loop行為感興趣        // 當調用runUntilDate方法時,observer檢測到run loop啟動並進入迴圈,observer會調用其回呼函數,第二個參數所傳遞的行為時kCFRunLoopEntry        // observer檢測到run loop的其他行為並調用回呼函數的操作與上面的描述相類似        [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow: 0.2]];        // 當run loop的已耗用時間到達時,會退出當前的run loop,observer同樣會檢測到run loop的退出行為,並調用其回呼函數,第二個參數傳遞的行為是kCFRunLoopExit.        --loopCount;    }while(loopCount);}



 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.