我想在2秒后更改我的UILabel
的文本。
我尝试将我的UILabel
的文本设置为“A text”,然后使用sleep(2)
,最后再将文本更改为“Another text”。
但是sleep(2)
只会冻结应用程序,并且“Another text”会在2秒钟内设置而不显示“A text”。
如何使“A text”显示2秒钟,然后显示“Another text”?
我想在2秒后更改我的UILabel
的文本。
我尝试将我的UILabel
的文本设置为“A text”,然后使用sleep(2)
,最后再将文本更改为“Another text”。
但是sleep(2)
只会冻结应用程序,并且“Another text”会在2秒钟内设置而不显示“A text”。
如何使“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)
#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)
然后,该函数应该如下所示:
@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()
}
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()
在主线程上执行。
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
}
以下方法很好。
你可以将
sleep(1);
替换为
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));