発端
[ 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は、無効だから停止というよりも解放に近い意味合いなんだ。だから再設定しないと動かないんだな
なるなる