在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