1.dispatch_after 工作起来就像一个延迟版的 dispatch_async 。你依然不能控制实际的执行时间,且一旦 dispatch_after 返回也就不能再取消它。
不知道何时适合使用 dispatch_after ?
自定义串行队列:在一个自定义串行队列上使用 dispatch_after 要小心。你最好坚持使用主队列。
主队列(串行):是使用 dispatch_after 的好选择;Xcode 提供了一个不错的自动完成模版。
并发队列:在并发队列上使用 dispatch_after 也要小心;你会这样做就比较罕见。还是在主队列做这些操作吧。
2.并发和并行通常被一起提到,所以值得花些时间解释它们之间的区别。
并发代码的不同部分可以“同步”执行。然而,该怎样发生或是否发生都取决于系统。多核设备通过并行来同时执行多个线程;然而,为了使单核设备也能实现这一点,它们必须先运行一个线程,执行一个上下文切换,然后运行另一个线程或进程。这通常发生地足够快以致给我们并发执行地错觉.虽然你可以编写代码在 GCD 下并发执行,但 GCD 会决定有多少并行的需求。并行要求并发,但并发并不能保证并行。
3.在何时以及何处使用 dispatch_sync :
自定义串行队列:在这个状况下要非常小心!如果你正运行在一个队列并调用 dispatch_sync 放在同一个队列,那你就百分百地创建了一个死锁。
主队列(串行):同上面的理由一样,必须非常小心!这个状况同样有潜在的导致死锁的情况。
并发队列:这才是做同步工作的好选择,不论是通过调度障碍,或者需要等待一个任务完成才能执行进一步处理的情况。
4.dispatch_suspend并不会立即暂停正在运行的block,而是在当前block执行完成后,暂停后续的block执行。
dispatch_set_target_queue小结:
dispatch_set_target_queue可以更改Dispatch Queue优先级。
dispatch_set_target_queue可以更改队列的执行层次,队列里的任务将会按照目标队列(target Queue)的队列来处理
文/Dely(简书作者)原文链接:http://www.jianshu.com/p/2a614531187f著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。**
网友评论