在某些情况下,GCD Timer是否会像NSTimer一样工作?

时间:2016-03-08 12:37:31

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

众所周知,在NSDefaultRunLoopMode下,当scrollView滚动时,NSTimer不会触发。如果我们需要计时器,我们应该将它添加到NSRunLoopCommonModes

考虑一下,

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, aQueue);
dispatch_resume(timer); // Is the place for `dispatch_resume(timer);` appropriate? Or we should
always put it after `dispatch_source_set_event_handler`?

dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, ti * NSEC_PER_SEC, ti * 0.1 * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer, ^{
    if (anAction) anAction();
});

当我像上面那样基于GCD创建计时器时,计时器是挂起还是被忽略,换句话说在某些情况下无法触发?或者它将永远运行?

这是我的想法:

如果队列被暂停怎么办?

如果它没有在队列上运行,则无论队列的状态如何,计时器都将继续运行。

如果它在队列上运行,则计时器和队列都将暂停。

计时器在哪里运行?

根据文件,dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, aQueue);表示:

  

创建一个新的调度源来监视低级系统对象和   自动将处理程序块提交给响应中的调度队列   事件。

它表示我们将事件处理程序提交给参数dispatch_queue_t queue,即我们将响应队列中的事件。但并不意味着计时器在队列上运行

谢谢:)

0 个答案:

没有答案