我想UILabel
在 2 秒后更改我的文本。
我尝试将我UILabel
的文本设置为"A text",然后使用sleep(2)
并最终将文本更改为"Another text"。
但sleep(2)
只会冻结应用程序并设置“另一个文本”而不显示“A 文本” 2 秒。
如何显示“A text” 2 秒,然后显示“Another text”?
我想UILabel
在 2 秒后更改我的文本。
我尝试将我UILabel
的文本设置为"A text",然后使用sleep(2)
并最终将文本更改为"Another text"。
但sleep(2)
只会冻结应用程序并设置“另一个文本”而不显示“A 文本” 2 秒。
如何显示“A text” 2 秒,然后显示“Another text”?
我知道我参加这个聚会迟到了。但我发现人们没有提到线程睡眠。如果您使用 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
}
您可以使用
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
或者如果您想定期显示它,请检查NSTimer
类。
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 3中,上面的例子可以写成:
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 设置更新视图的特定时间,而不是使用睡眠。
您需要使用计时器。使用 sleep 将停止您的整个程序。检查NSTimer
下面的方法很好。
你可以更换你的
睡眠(1);
和
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));