2秒後にUILabel
のテキストを変更したい。
UILabel
のテキストを"A text"に設定し、sleep(2)
を使用して、最終的にテキストを"Another text"に変更してみました。 。
しかし、sleep(2)
はアプリをフリーズするだけで、"Another text"は2秒間"A text"を表示せずに設定されます。
"A text"を2秒間表示してから"Another text"を表示するにはどうすればよいですか?
使用できます
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
または、定期的に表示する場合は、 NSTimer
クラスを確認してください。
私はこのパーティーに遅れていることを知っています。しかし、私は人々がスレッドスリープについて言及していないことを発見しました。 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"];
});
});
NSTimerは素晴らしいソリューションだと思います。 NSTimerの目標を達成するための別のオプションを提供するだけのソリューションです。
読んでください: NSTimerの使用方法
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(doSomethingWhenTimeIsUp:)
userInfo:nil
repeats:NO];
クラスでは、このメソッドが必要です。
- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {
// YES! Do something here!!
}
Swift 2.0では、この方法を使用できます。
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: "doSomethingWhenTimeIsUp:",
userInfo: nil,
repeats: false)
NSTimerのエンティティを作成し、タイマーが作成されたNSThreadに関連付けられたNSRunLoopにタイマーを自動的に追加します。
Swift 2.2では、selectを呼び出す方法は次のとおりです。
#selector(doSomethingWhenTimeIsUp(_:))
だから、それは次のようなものです:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: #selector(doSomethingWhenTimeIsUp()),
userInfo: nil,
repeats: false)
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
}
Swift 4では、次のようにできます。
let delaySeconds = 2.0
DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
doSomethingWhenTimeIsUp()
}
次に、funcは次のようになります。
private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
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
}
_
次のようにNSTimer
を使用できます-
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(updateLabel:)
userInfo:nil
repeats:YES];
別のメソッドupdateLabel
を定義し、そこで更新を行います。必要に応じてtimeIntervalを定義します...
また、repeats
をYES
に設定すると、このセレクターが0.5秒ごとに実行されるようになります(上記の場合)。
あなたはタイマーでこれを達成することができます、例えば。
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
}
これは、ビューがランループの終わりまで更新されないためです。スリープを使用する代わりに、NSTimerを使用してビューを更新する特定の時間を設定してみてください。
タイマーを使用する必要があります。スリープを使用すると、プログラム全体が停止します。チェック NSTimer
次の方法が適しています。
交換できます
sleep(1);
と
dispatch_semaphore_tセマフォ= dispatch_semaphore_create(0); dispatch_semaphore_wait(semaphore、dispatch_time(DISPATCH_TIME_NOW、1 * NSEC_PER_SEC));