How to Wait in Objective-C and Swift

后端 未结 8 808
自闭症患者
自闭症患者 2021-01-31 02:22

I want to change my UILabel\'s text after 2 seconds.

I tried setting my UILabel\'s text to \"A text\", and use sleep(2) a

相关标签:
8条回答
  • 2021-01-31 02:57

    I know I am late to this party. But I found people haven't mention thread sleep. If you are using GCD to call that function. You can use :

    [NSThread sleepForTimeInterval:2.0f];   
    

    to delay the thread for 2 seconds.

    [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"];
            });
        });
    

    Edit 2 (Feb 2015):

    I think the NSTimer is a great solution. My solution just giving another option to achieve the goal of NSTimer.

    Please read: How do I use NSTimer?

    [NSTimer scheduledTimerWithTimeInterval:2.0
                                     target:self
                                   selector:@selector(doSomethingWhenTimeIsUp:)
                                   userInfo:nil
                                    repeats:NO];
    

    In the class, you need this method:

    - (void) doSomethingWhenTimeIsUp:(NSTimer*)t {
    
            // YES! Do something here!!
    
    }
    

    Edit 3 (May 2016):

    In Swift 2.0, you can use this way:

     NSTimer.scheduledTimerWithTimeInterval(2.0, 
                                             target: self, 
                                           selector: "doSomethingWhenTimeIsUp:", 
                                           userInfo: nil, 
                                            repeats: false)
    

    It creates an NSTimer's entity and adds the timer automatically to the NSRunLoop associated with the NSThread in which the timer is created.

    Edit 4 (Jun 2016):

    In Swift 2.2, the way to invoke select is:

    #selector(doSomethingWhenTimeIsUp(_:))
    

    So, it is something like:

      NSTimer.scheduledTimerWithTimeInterval(2.0,
                                          target: self,
                                          selector: #selector(doSomethingWhenTimeIsUp()),
                                          userInfo: nil,
                                          repeats: false)
    

    Edit 5 (Oct 2016):

    In Swift 3, the way to invoke select is:

    #selector(doSomethingWhenTimeIsUp)
    

    So, it is something like:

            Timer.scheduledTimer(timeInterval: 2.0,
                                 target: self,
                                 selector:#selector(doSomethingWhenTimeIsUp),
                                 userInfo: nil,
                                 repeats: false)
    

    Then, the func should looks like this:

            @objc private func doSomethingWhenTimeIsUp(){
            // Do something when time is up
            }
    

    Edit 6 (May 2018):

    In Swift 4, we can do as below way.

        let delaySeconds = 2.0
        DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
            doSomethingWhenTimeIsUp()
        }  
    

    Then, the func should looks like this:

        private func doSomethingWhenTimeIsUp(){
            // Do something when time is up
            }
    
    0 讨论(0)
  • 2021-01-31 02:57

    Grand Central Dispatch has a helper function dispatch_after() for performing operations after a delay that can be quite helpful. You can specify the amount of time to wait before execution, and the dispatch_queue_t instance to run on. You can use dispatch_get_main_queue() to execute on the main (UI) thread.

    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
    });
    

    In Swift 3, the above example can be written as:

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // do something
    }
    
    0 讨论(0)
提交回复
热议问题