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