2011-04-18 2 views
0

私はメソッドを10秒ごとに呼びたいと思っていますが、NSTimer以外のものを使用したいと思います。これを行うには何が使えますか?NSTimerを使用せずに10秒ごとにメソッドをトリガーする方法はありますか?

+4

? NSTimerはこの問題の完璧な解決策のようです。 –

+0

Xcodeはフレームワークや言語ではなく、IDEであるため、IDE自体について質問しない限り、質問にタグを付けてタイトルに配置しないでください。 –

答えて

0

....

あなたはCocos2Dを使用している場合は、スケジュールの方法、ここで

を使用すると、その下のリンクです両方を示しています。

How can I create a count down timer for cocos2d?

+0

Cocos2Dを使用していないのであれば、NSTimerを使うのはなぜですか? –

11

私はあなたがperformSelector:withObject:afterDelay:設定でループを作成することができます

[NSTimer scheduledTimerWithTimeInterval:10.0 
           target:self 
           selector:@selector(someMethod) 
           userInfo:nil 
           repeats:YES]; 
+0

はい、私はすでにCADisplaylink –

+0

を使用しています。ボールが10秒ごとに動くようにしたいからですが、同じ方法でタイマーを使うことはできません。 –

+0

私はそれが問題だとは思わない - でも'someMethod'を呼び出す' anotherMethod'を作成してください:) –

2

...あなたはタイマーを使いたくありませんでしたが、ちょうどあなたがそれをタイマーであることだろうかシンプル知ることを確認すると知っていますafterDelayを10.0に設定します。

これはお勧めできませんが、NSTimerを使用してください。あなたはCocos2Dを使用していない場合は、あなたがこれを行うにはNSTimerを使用する必要が

- (void)callMeEvery10Seconds 
{ 
    [self performSelector:@selector(callMeEvery10Seconds) 
       withObject:nil 
       afterDelay:10.0]; 

    // ... code comes here ... 
} 
3

あなたはタイマーを使用したくない場合は、内部NSOperationQueue、neverthを利用しますどのGCDを使用することができますすべての場合において誠実さが働くでしょう。例えばのために:私は、上記の方法がうまくいかなかったので、NSOperationから継承したクラスを持っていたので、私はGCDで行く行くた:

double delayInSeconds = 3.0;  
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);  
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_after(popTime, queue, ^{ 
     [self methodYouWantToCall]; 
    }); 

上記のコードは、すべて3秒後にメソッドを呼び出しますmethodYouWantToCall。

+0

「内部でNSOperationQueueを使用するGCD」これは正しくありません。これは逆です。 –

0

そうするための最も簡単な方法は次のとおりです。あなたはタイマーを使用したくないのはなぜ

- (void)scheduleLoopInSeconds:(NSTimeInterval)delayInSeconds 
{ 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_after(popTime, queue, ^{ 
     [self callWhatEverMethodYouWant]; 
     [self shceduleLoopcaInSeconds:delayInSeconds];//set next iteration 
    }); 

} 

// now whenever you like call this, and it will be triggering "callWhatEverMethodYouWant" every 10 secs. 
[self shceduleLoopcaInSeconds:10.0]; 
+0

WOW、私はこの方法をテストしましたが、正常に動作しますが、NSTimerを使用した場合のCPU使用率は約25%で、99%に急上昇しました。 WTF?私はこれがブロックのディスパッチに関連するオーバヘッドによって呼び出されていると思います! – SpaceDog

関連する問題