在Objective-C中如何等待
我想在2秒后更改我的UILabel
的文本。
我尝试将我的UILabel
的文本设置为“一个文本” ,并使用sleep(2)
,最后将文本更改为“另一个文本” 。
但sleep(2)
只冻结了应用程序,并设置了“另一个文本” ,而不显示“文本” 2秒。
如何显示“文本” 2秒钟,然后显示“另一个文本” ?
您可以使用
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
或者如果要定期显示它,请检查NSTimer
类。
我知道我迟到了这个派对。 但是我发现人们没有提到线程睡眠。 如果您正在使用GCD来调用该function。 您可以使用 :
[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是一个很好的解决scheme。 我的解决scheme只是提供另一个选项来实现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)
它创build一个NSTimer的实体,并将定时器自动添加到与创build定时器的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)
然后,函数应该看起来像这样:
@objc 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 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
可确保此select器每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 }
这是因为直到runloop结束才更新视图。 而不是使用睡眠尝试使用NSTimer设置特定的时间来更新视图。
你需要使用一个计时器。 使用睡眠将停止您的整个程序。 检查NSTimer