発端
[ NSTimer fire ];
NSTimer で fire は、再開と思ってたのですが、実際停止後に実行しても再開しないから 使えないじゃんと思ってたし、実際再開しなかった。(大きな勘違いなんですが・・・)
Google様に聞いてもそのように見える記事もあって、そうだと今まで思ってた。
ふと、再開なのになんで 名前がfire(発火する) なのかなと疑問になって、使用方法がちがう可能性があると思い実験してみました。
確認
環境
Xcode7
IOSシミュレーター
プログラム
NSTimer *timerObj=nil; -(void)startTimer { if( !timerObj ) { NSLog(@"timerStart"); timerObj = [ NSTimer scheduledTimerWithTimeInterval:5.0f //インターバル target:self //ターゲット selector:@selector(sysTimer:) //メソッド userInfo:nil //パラメータ repeats:YES //繰り返し ]; } } -(void)stopTimer { [timerObj invalidate]; //停止 timerObj=nil; //停止したらオブジェクト削除 } -(void)sysTimer:(NSTimer*)timer { NSLog(@"timerProc"); // // インターバルタイマー処理 // } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"fire"); [timerObj fire]; }
方法
[self startTimer];実行後にTapする
実験1 repeatsパラメータをNOにして確認した(繰り返しなしの場合) 結果
・インターバルタイマー実行後 fire 実行しても何も起こらなかった。( ← Google様の言うとうり)
・インターバルタイマー実行前(5s内)fire 実行で timerProcログがすぐ出てきた。( キター )
実験2 repeatsパラメータをYESにして確認した(繰り返しの場合) 結果
・インターバルタイマー実行後 fire 実行で timerProcログがすぐ出てきた。( キター )
・インターバルタイマー実行タイミングでも timerProcログがすぐ出てきた。( そーなんだ )
結論
fire は、インターバルタイマメソッドを即実行する(発火)メソッドである。
再開でなく タイマーインスタンスが有効期間内で使用するものである。
まとめ
repeatsパラメータがNOの場合
通常は、
指定インターバル時間以内でfireした場合
repeatsパラメータがYESの場合
通常は、
指定インターバル時間以内でfireした場合
即メソッド実行しますが、指定インターバル時間毎にもメソッド実行します。
実行前倒しになるのかなと思ったが、そうではないらしい
これだから fire なのね。納得!!!
invalidateは、無効だから停止というよりも解放に近い意味合いなんだ。だから再設定しないと動かないんだな
なるなる