48

我想UILabel在 2 秒后更改我的文本。

我尝试将我UILabel的文本设置为"A text",然后使用sleep(2)并最终将文本更改为"Another text"

sleep(2)只会冻结应用程序并设置“另一个文本”而不​​显示“A 文本” 2 秒。

如何显示“A text” 2 秒,然后显示“Another text”

4

8 回答 8

87

我知道我参加这个聚会迟到了。但我发现人们没有提到线程睡眠。如果您使用 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
}
于 2013-08-08T02:44:31.597 回答
44

您可以使用

[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];

或者如果您想定期显示它,请检查NSTimer类。

于 2011-08-08T14:15:23.473 回答
30

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
}
于 2013-08-08T03:07:30.453 回答
12

你可以使用NSTimer,像这样 -

[NSTimer scheduledTimerWithTimeInterval:0.5 
                                 target:self 
                               selector:@selector(updateLabel:) 
                               userInfo:nil 
                                repeats:YES];

定义另一个方法updateLabel并在那里进行更新。定义您的 timeInterval 以满足您的需求...

还设置repeatsYES确保此选择器每 0.5 秒执行一次(在上述情况下)。

于 2011-08-08T14:14:38.737 回答
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
}
于 2011-08-08T14:14:12.190 回答
2

这是因为视图直到运行循环结束才更新。尝试使用 NSTimer 设置更新视图的特定时间,而不是使用睡眠。

于 2011-08-08T14:14:40.260 回答
2

您需要使用计时器。使用 sleep 将停止您的整个程序。检查NSTimer

于 2011-08-08T14:14:47.177 回答
0

下面的方法很好。

你可以更换你的

睡眠(1);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));

于 2019-06-28T03:44:07.577 回答