2011-07-19 13 views
10

を発射いない私は、このコードではinit NSTimerありますNSTimer

testTimer = [[NSTimer alloc] initWithFireDate:[new objectAtIndex:0] interval:0.0 target:self selector:@selector(works:) userInfo:nil repeats:NO]; 

[new objectAtIndex:0]が過去にNSDateです。

私がアプリケーションを起動すると、fireDateがすぐに(日付が過去であるため)、タイマーが作成されますが、決して私の仕事のメソッドを呼び出すことはありません。 (-(void)works:(id)sender

これはなぜ起こっているのですか?

+0

に変更することでしたか? – Aravindhan

+6

Macアプリです –

+1

Matt、[osx]タグを使用すると、iOSの再訪の騒ぎを防ぐことができます。 :) –

答えて

18

initWith..メソッドを使用してタイマーオブジェクトを作成する場合は、現在の実行ループに追加する必要があります。

NSRunLoop * theRunLoop = [NSRunLoop currentRunLoop]; 
[theRunLoop addTimer:testTimer forMode:NSDefaultRunLoopMode]; 

また、設定したい場合は、scheduled...メソッドを使用してタイマーを作成してください。

+0

うん、そうです。 –

+4

@Matt: 'alloc' /' init'を使うことはあなたがタイマーを所有し、そのメモリを管理する必要があるのに対し、 'scheduledTimer ...'メソッドはあなたが所有していないタイマーを返すことに注意してください。どちらの場合も、実行ループによって保持されます。 –

+0

@josh情報に感謝します! –

14

最近NSTimerに問題がありました。私の場合、scheduledTimerWithTimeIntervalメソッドはマルチスレッドセーフではないことに気付きませんでした。タイマーをメインスレッドに移動すると、それは動作を開始しました。

+1

どうしたらいいですか?私は一見無作為に発射することに問題があります。 –

+5

これであなたのnstimerをラップしてみてください:dispatch_async(dispatch_get_main_queue()、^ { }); – Dobler

1

私はDoblerと同じ問題があったと思いますが、私の解決策は異なります。

問題

はタイマーが

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{}) 

コール内のブロックにGCDのスレッドで作成され、予定されていたということでした(実際には深い入れ子になったので、これがそうであったことは明らかではなかったです)。

NSTimer's scheduledTimerWithTimeInterval:...を使用すると、タイマーを無効な実行ループに配置しました。

修正は、この問題のiphoneタグを使用することが間違っているかどうかを

timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(...) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];