众所周知,在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
,即我们将响应队列中的事件。但并不意味着计时器在队列上运行。
谢谢:)