sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

GCDでインターバルタイマー

インターバルタイマーを実装するのにお手軽なのは何かと考えて、NSTimerとか使った事のないクラスを調べるのも面倒なので、GCDを使う事にしました。何でも揃ってて本当に便利なGCDは手放せません。

さて、タイマーと言っても、実際にはdispatch_sourceの一つとして作成することになります。

ますはクラスにインスタンス変数を追加

dispatch_source_t _timerSource; // タイマーソース

あとは適当にタイマーソースを作り、作動させるだけ

// タイマーソース作成  
_timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
dispatch_retain(_timerSource);
// タイマーキャンセルハンドラ設定
dispatch_source_set_cancel_handler(_timerSource, ^{
    if(_timerSource){
        dispatch_release(_timerSource); // releaseを忘れずに
        _timerSource = NULL;
    }
});
// タイマーイベントハンドラ
dispatch_source_set_event_handler(_timerSource, ^{
    // ここに定期的に行う処理を記述
});
// インターバル等を設定
dispatch_source_set_timer(_timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), NSEC_PER_SEC * 5, NSEC_PER_SEC / 2); // 直後に開始、5秒間隔で 0.5秒の揺らぎを許可
// タイマー開始
dispatch_resume(_timerSource);

一時停止させたいならsuspend

// ベースタイマ一時停止
if(_timerSource){
    dispatch_suspend(_timerSource);
}

完全に停止するならcancel

// ベースタイマ破棄
if(_timerSource){
    dispatch_source_cancel(_timerSource);
}

AppDelegateの

- (void)applicationDidBecomeActive:(UIApplication *)application

- (void)applicationWillResignActive:(UIApplication *)application

でタイマーの生成&開始/破棄を行ってやれば、アプリがアクティブな間、定期的な処理を行ったりということも可能です。