web-dev-qa-db-ja.com

Cocoaで指定された期間待機する

ココアで特定の時間を待つ簡単な方法は、以下で思いついたものよりもありますか?

- (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];
}
28

有る

usleep(1000000);

そして

[NSThread sleepForTimeInterval:1.0f];

どちらも1秒間スリープします。

67
Brad Larson

これを行うNSTimerの方法を次に示します。それはあなたが使っている方法よりも醜いかもしれませんが、それは繰り返しイベントを可能にするので、私はそれを好みます。

[NSTimer scheduledTimerWithTimeInterval:0.5f 
                                 target:self
                               selector: @selector(doSomething:) 
                               userInfo:nil
                                repeats:NO];

Usleep()のように、アプリをハングさせて応答を停止させるようなことは避けたいと考えています。

10
Jason Moore

(まだ)存在するかどうかはわかりませんが、10.6のブロック(または10.5およびiPhoneの PLBlocks )を使用すると、performBlock:afterDelay:のような小さなラッパーを書くのはかなり簡単です。これは、スレッド全体をスリープさせる必要なしに、望みどおりの動作をします。確かに便利な小さなコードになります。

Mike Ashは このようなアプローチについて彼のブログに書いています

NSString *something = ...;
RunAfterDelay(0, ^{
    NSLog(@"%@", something);
    [self doWorkWithSomething: something];
});
3
Ole Begemann

おそらく NSTimer を使用して、コールバックとして「doStuffAfterWaiting」メッセージを送信する必要があります。あらゆる種類の「スリープ」は、目覚めるまでスレッドをブロックします。 U.I.にある場合スレッド、それはあなたのアプリが「死んだ」ように見える原因になります。それがそうでないとしても、それは悪い形です。コールバックアプローチは、指定した時間間隔に達するまで、CPUを解放して他のタスクを実行します。

この doc には使用例があり、タイマーを作成する方法と場所の違いについて説明しています。

もちろん、performSelector:afterDelay:も同じことを行います。

2
pestilence669

単純なusleepの何が問題になっていますか?つまり、「ココアの純度」を除いて、それは他のソリューションよりもはるかに短いです:)

2
F'x

待つには NSThread sleepForTimeInterval:

この解決策は実際には以下から取得されました: Objective-C/CocoaでのJavaのThread.sleep()に相当するものは何ですか?

0
Malaxeur

非同期ソリューションを気にしない場合は、次のようにします。

[[NSOperationQueue currentQueue] addOperationWithBlock:^{
    [self doStuffAfterWaiting];
}];
0