如何在Objective-C和Swift中等待

jyl*_*lee 43 objective-c wait ios performselector swift

我想UILabel在2秒后改变我的文字.

我尝试将我UILabel的文本设置为"文本",然后使用sleep(2)并最终将文本更改为"另一个文本".

sleep(2)只冻结应用程序并设置"另一个文本"而不显示"A文本" 2秒.

如何显示"A text" 2秒然后显示"Another text"

Yi *_*ang 80

我知道我迟到了.但我发现人们没有提到线程睡眠.如果您使用GCD调用该功能.您可以使用 :

[NSThread sleepForTimeInterval:2.0f];   
Run Code Online (Sandbox Code Playgroud)

延迟线程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"];
        });
    });
Run Code Online (Sandbox Code Playgroud)

编辑2(2015年2月):

我认为NSTimer是一个很好的解决方案.我的解决方案只是提供另一种选择来实现NSTimer的目标.

请阅读:我如何使用NSTimer?

[NSTimer scheduledTimerWithTimeInterval:2.0
                                 target:self
                               selector:@selector(doSomethingWhenTimeIsUp:)
                               userInfo:nil
                                repeats:NO];
Run Code Online (Sandbox Code Playgroud)

在课堂上,你需要这个方法:

- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {

        // YES! Do something here!!

}
Run Code Online (Sandbox Code Playgroud)

编辑3(2016年5月):

在Swift 2.0中,您可以使用以下方式:

 NSTimer.scheduledTimerWithTimeInterval(2.0, 
                                         target: self, 
                                       selector: "doSomethingWhenTimeIsUp:", 
                                       userInfo: nil, 
                                        repeats: false)
Run Code Online (Sandbox Code Playgroud)

它创建一个NSTimer的实体,并自动将计时器添加到与创建计时器的NSThread相关联的NSRunLoop.

编辑4(2016年6月):

在Swift 2.2中,调用select的方法是:

#selector(doSomethingWhenTimeIsUp(_:))
Run Code Online (Sandbox Code Playgroud)

所以,它是这样的:

  NSTimer.scheduledTimerWithTimeInterval(2.0,
                                      target: self,
                                      selector: #selector(doSomethingWhenTimeIsUp()),
                                      userInfo: nil,
                                      repeats: false)
Run Code Online (Sandbox Code Playgroud)

编辑5(2016年10月):

在Swift 3中,调用select的方法是:

#selector(doSomethingWhenTimeIsUp)
Run Code Online (Sandbox Code Playgroud)

所以,它是这样的:

        Timer.scheduledTimer(timeInterval: 2.0,
                             target: self,
                             selector:#selector(doSomethingWhenTimeIsUp),
                             userInfo: nil,
                             repeats: false)
Run Code Online (Sandbox Code Playgroud)

然后,func应该如下所示:

        @objc private func doSomethingWhenTimeIsUp(){
        // Do something when time is up
        }
Run Code Online (Sandbox Code Playgroud)

编辑6(2018年5月):

Swift 4中,我们可以按照以下方式进行操作.

    let delaySeconds = 2.0
    DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
        doSomethingWhenTimeIsUp()
    }  
Run Code Online (Sandbox Code Playgroud)

然后,func应该如下所示:

    private func doSomethingWhenTimeIsUp(){
        // Do something when time is up
        }
Run Code Online (Sandbox Code Playgroud)


Mic*_*gar 40

您可以使用

[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
Run Code Online (Sandbox Code Playgroud)

或者如果要定期显示,请检查NSTimer课程.


Mic*_*lum 28

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
});
Run Code Online (Sandbox Code Playgroud)

Swift 3中,上面的例子可以写成:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)


Sri*_*aju 12

你可以NSTimer像这样使用-

[NSTimer scheduledTimerWithTimeInterval:0.5 
                                 target:self 
                               selector:@selector(updateLabel:) 
                               userInfo:nil 
                                repeats:YES];
Run Code Online (Sandbox Code Playgroud)

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

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


Geo*_*ton 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
   }
Run Code Online (Sandbox Code Playgroud)