ココアで特定の時間を待つ簡単な方法は、以下で思いついたものよりもありますか?
- (void) buttonPressed {
[self makeSomeChanges];
// give the user some visual feedback and wait a bit so he can see it
[self displayThoseChangesToTheUser];
[self performSelector:@selector(buttonPressedPart2:) withObject:nil afterDelay:0.35];
}
- (void) buttonPressedPart2: (id)unused {
[self automaticallyReturnToPreviousView];
}
明確にするために、 機能的 このコードの問題-私の唯一の牛肉は 文体 1。私の場合、フローは十分に機能するほど単純ですが、それをカプセル化するか、いくつかの条件文を入れてみてください。次のような(架空の)例のようなコードで待機してから同じポイントに戻る方法を見つけることができなかったのは、私にとって悩みの種です。
- (void) buttonPressed {
[self doStuff];
[UIMagicUnicorn waitForDuration:0.35];
[self doStuffAfterWaiting];
}
有る
usleep(1000000);
そして
[NSThread sleepForTimeInterval:1.0f];
どちらも1秒間スリープします。
これを行うNSTimerの方法を次に示します。それはあなたが使っている方法よりも醜いかもしれませんが、それは繰り返しイベントを可能にするので、私はそれを好みます。
[NSTimer scheduledTimerWithTimeInterval:0.5f
target:self
selector: @selector(doSomething:)
userInfo:nil
repeats:NO];
Usleep()のように、アプリをハングさせて応答を停止させるようなことは避けたいと考えています。
(まだ)存在するかどうかはわかりませんが、10.6のブロック(または10.5およびiPhoneの PLBlocks )を使用すると、performBlock:afterDelay:
のような小さなラッパーを書くのはかなり簡単です。これは、スレッド全体をスリープさせる必要なしに、望みどおりの動作をします。確かに便利な小さなコードになります。
Mike Ashは このようなアプローチについて彼のブログに書いています :
NSString *something = ...;
RunAfterDelay(0, ^{
NSLog(@"%@", something);
[self doWorkWithSomething: something];
});
おそらく NSTimer を使用して、コールバックとして「doStuffAfterWaiting」メッセージを送信する必要があります。あらゆる種類の「スリープ」は、目覚めるまでスレッドをブロックします。 U.I.にある場合スレッド、それはあなたのアプリが「死んだ」ように見える原因になります。それがそうでないとしても、それは悪い形です。コールバックアプローチは、指定した時間間隔に達するまで、CPUを解放して他のタスクを実行します。
この doc には使用例があり、タイマーを作成する方法と場所の違いについて説明しています。
もちろん、performSelector:afterDelay:も同じことを行います。
単純なusleep
の何が問題になっていますか?つまり、「ココアの純度」を除いて、それは他のソリューションよりもはるかに短いです:)
待つには NSThread sleepForTimeInterval:
。
この解決策は実際には以下から取得されました: Objective-C/CocoaでのJavaのThread.sleep()に相当するものは何ですか?
非同期ソリューションを気にしない場合は、次のようにします。
[[NSOperationQueue currentQueue] addOperationWithBlock:^{
[self doStuffAfterWaiting];
}];