2016年1月5日 星期二

iOS筆記:一個簡單的GCD timer demo

從初學OC後一年才發現我當初看的參考書完全沒教任何有關thread的東西
用過發現GCD真的是最容易用的一個(點頭

這是用GCD仿製NSTimer,讓這個名叫action的thread每0.1秒醒來去執行prepareAction的方法
相較於NSTimer的優勢在於:
一旦用了多工,NSTimer要是不在同條線上是關不掉的!
然後關了又開開了又關⋯⋯開了幾個就累積幾個同樣的timer
用GCD的寫法既可以多工又不用怕要怎麼處理關掉的情況(起碼actionFlag是在main thread去設定的),只要block內的程式碼結束了這條新開的thread就會被回收走了
BTW, GCD中用NSTimer是沒有反應的
BTW2,  要重複執行的方法一樣是在action thread裡run
還有記得更新UI的時候要把它拉去main thread去執行
(同場加映stackoverflow問答:Timer inside global queue is not calling in iOS

dispatch_async(dispatch_queue_create("action", nil), ^{
    //flag關掉thread會自己結束
    while (actionFlag) {
        [self prepareAction];
        [NSThread sleepForTimeInterval:0.1f];
    }
});



話說要如何改寫?
把NSTimer scheduledTimerWithTimeInterval的部分直接用上述程式碼取代,selector跟Interval放進while(repeats=YES)裡

沒有留言:

張貼留言