Timer in another thread in Objective - C

前端 未结 2 523
情话喂你
情话喂你 2021-02-06 04:40

I have to define method which should be invoked periodically with some time interval. I need to invoke it in another thread (NOT main thread), because this method is used to get

相关标签:
2条回答
  • 2021-02-06 05:13

    Unless you have a specific need for timers, you can use Grand Central Dispatch.

    The following snippet will execute a block after 2 seconds, on the default priority concurrent queue (i.e a background thread). You can change the priority of the queue if you see fit, but unless you're dealing with lots of different operations on concurrent queues, default will suffice.

    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    
    dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        // Your code here
    });
    

    If you're wanting to call this repeatedly, then you can use dispatch_source_set_timer to set a recurring execution. The jist of it is below:

    // Create a dispatch source that'll act as a timer on the concurrent queue
    // You'll need to store this somewhere so you can suspend and remove it later on
    dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
                                                              dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); 
    
    // Setup params for creation of a recurring timer
    double interval = 2.0;
    dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0);
    uint64_t intervalTime = (int64_t)(interval * NSEC_PER_SEC);
    dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0);
    
    // Attach the block you want to run on the timer fire
    dispatch_source_set_event_handler(dispatchSource, ^{
        // Your code here
    });
    
    // Start the timer
    dispatch_resume(dispatchSource);
    
    // ----
    
    // When you want to stop the timer, you need to suspend the source
    dispatch_suspend(dispatchSource);
    
    // If on iOS5 and/or using MRC, you'll need to release the source too
    dispatch_release(dispatchSource);
    
    0 讨论(0)
  • 2021-02-06 05:17

    Use NSRunLoop and NSTimer for work

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer) userInfo:nil repeats:NO];
    
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    
    0 讨论(0)
提交回复
热议问题