web-dev-qa-db-ja.com

Objective-Cで待つ方法とSwift

2秒後にUILabelのテキストを変更したい。

UILabelのテキストを"A text"に設定し、sleep(2)を使用して、最終的にテキストを"Another text"に変更してみました。 。

しかし、sleep(2)はアプリをフリーズするだけで、"Another text"は2秒間"A text"を表示せずに設定されます。

"A text"を2秒間表示してから"Another text"を表示するにはどうすればよいですか?

43
jylee

使用できます

[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];

または、定期的に表示する場合は、 NSTimer クラスを確認してください。

40
Michał Zygar

私はこのパーティーに遅れていることを知っています。しかし、私は人々がスレッドスリープについて言及していないことを発見しました。 GCDを使用してその関数を呼び出す場合。以下を使用できます。

[NSThread sleepForTimeInterval:2.0f];   

スレッドを2秒間遅らせる。

[self changeText: @"A text"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //Here your non-main thread.
        [NSThread sleepForTimeInterval:2.0f];   
        dispatch_async(dispatch_get_main_queue(), ^{
            //Here you returns to main thread.
            [self changeText: @"Another text"];
        });
    });

編集2(2015年2月):

NSTimerは素晴らしいソリューションだと思います。 NSTimerの目標を達成するための別のオプションを提供するだけのソリューションです。

読んでください: NSTimerの使用方法

[NSTimer scheduledTimerWithTimeInterval:2.0
                                 target:self
                               selector:@selector(doSomethingWhenTimeIsUp:)
                               userInfo:nil
                                repeats:NO];

クラスでは、このメソッドが必要です。

- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {

        // YES! Do something here!!

}

編集3(2016年5月):

Swift 2.0では、この方法を使用できます。

 NSTimer.scheduledTimerWithTimeInterval(2.0, 
                                         target: self, 
                                       selector: "doSomethingWhenTimeIsUp:", 
                                       userInfo: nil, 
                                        repeats: false)

NSTimerのエンティティを作成し、タイマーが作成されたNSThreadに関連付けられたNSRunLoopにタイマーを自動的に追加します。

編集4(2016年6月):

Swift 2.2では、selectを呼び出す方法は次のとおりです。

#selector(doSomethingWhenTimeIsUp(_:))

だから、それは次のようなものです:

  NSTimer.scheduledTimerWithTimeInterval(2.0,
                                      target: self,
                                      selector: #selector(doSomethingWhenTimeIsUp()),
                                      userInfo: nil,
                                      repeats: false)

編集5(2016年10月):

Swift 3では、selectを呼び出す方法は次のとおりです。

#selector(doSomethingWhenTimeIsUp)

だから、それは次のようなものです:

        Timer.scheduledTimer(timeInterval: 2.0,
                             target: self,
                             selector:#selector(doSomethingWhenTimeIsUp),
                             userInfo: nil,
                             repeats: false)

次に、funcは次のようになります。

        @objc private func doSomethingWhenTimeIsUp(){
        // Do something when time is up
        }

編集6(2018年5月):

Swift 4では、次のようにできます。

    let delaySeconds = 2.0
    DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
        doSomethingWhenTimeIsUp()
    }  

次に、funcは次のようになります。

    private func doSomethingWhenTimeIsUp(){
        // Do something when time is up
        }
80
Yi Jiang

Grand Central Dispatchには、遅延後に操作を実行するためのヘルパー関数dispatch_after()があり、非常に役立ちます。実行前に待機する時間と、実行する_dispatch_queue_t_インスタンスを指定できます。 dispatch_get_main_queue()を使用して、メイン(UI)スレッドで実行できます。

_double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    // do something
});
_

Swiftでは、上記の例を次のように書くことができます。

_DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    // do something
}
_
28
Mick MacCallum

次のようにNSTimerを使用できます-

[NSTimer scheduledTimerWithTimeInterval:0.5 
                                 target:self 
                               selector:@selector(updateLabel:) 
                               userInfo:nil 
                                repeats:YES];

別のメソッドupdateLabelを定義し、そこで更新を行います。必要に応じてtimeIntervalを定義します...

また、repeatsYESに設定すると、このセレクターが0.5秒ごとに実行されるようになります(上記の場合)。

12

あなたはタイマーでこれを達成することができます、例えば。

   NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:4.0 target:self selector:@selector(eventToFire:) userInfo:nil repeats:YES]; // Fire every 4 seconds.

   ...

   - (void)eventToFire:(NSTimer*)timer {
      // Do Something
   }
5
George Johnston

これは、ビューがランループの終わりまで更新されないためです。スリープを使用する代わりに、NSTimerを使用してビューを更新する特定の時間を設定してみてください。

2
Dave

タイマーを使用する必要があります。スリープを使用すると、プログラム全体が停止します。チェック NSTimer

2
Pepe

次の方法が適しています。

交換できます

sleep(1);

dispatch_semaphore_tセマフォ= dispatch_semaphore_create(0); dispatch_semaphore_wait(semaphore、dispatch_time(DISPATCH_TIME_NOW、1 * NSEC_PER_SEC));

0
JateXu