使用dispatch_after作为NSTimer的替代方案,用于定期调度的操作

时间:2014-04-04 06:51:15

标签: ios objective-c grand-central-dispatch nstimer

对于应该在后台线程上进行的定期操作,我通常会使用NSTimer。我想知道为了同样的目的使用gcd是否有任何缺点:

  //Set up a dispatch queue owned by an instance of the class. (ie in init). 
  dispatch_queue_t backgroundQueue = dispatch_queue_create("some.queue", 
       DISPATCH_QUEUE_SERIAL);

- (void)scheduleRefresh
{

    __weak id weakSelf = self;        
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 120 * NSEC_PER_SEC), 
        backgroundQueue, ^
    {
        //Do some recurring task. 

       //Now, schedule again, by calling recursively, unless weakSelf is nil
       [weakSelf scheduleRefresh] 
    });
}

1 个答案:

答案 0 :(得分:8)

您无法取消延迟的块执行(无需编写其他包装代码)。使用计时器,您只需使其无效。

该块保留了它的内容,因此您需要积极考虑并(可能)编写额外的代码来处理它。