/**
* 异步具备开线程的能力, 同步不具有
* 串行: 任务一个接一个, 依次执行
* 并发: 任务不相互依赖, 同时执行
*/
/**
* 快速迭代遍历 ,index不确定
* 和普通for循环一样,dispatch_apply和dispatch_apply_f函数也是在所有迭代完成之后才会返回,因此这两个函数会阻塞当前线程.
* 也就是说导致当前线程挂起, 去执行这个任务,千万注意添加的queue不要是串行的,会发生死锁.
* 如果在主队列执行,添加串行任务, 则导致这些任务去寻找主线程执行任务, 结果发现主线程此时已经挂起, 只能等待主线程激活, 这些就会,主线程等待任务结束, 任务等待主线程激活, 最终死锁.
*/
dispatch_queue_t concurentQueue = dispatch_queue_create("com.manajay.concurrentQueue-async", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(100, concurentQueue, ^(size_t index) {
dispatch_async(concurentQueue, ^{
// 任务
});
});
// 2. 回到主线程
if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {
} else {
dispatch_async(dispatch_get_main_queue(), ^{
// 任务
});
}
// 宏定义 回到主线程
#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block)\
if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {\
block();\
} else {\
dispatch_async(dispatch_get_main_queue(), block);\
}
#endif
网友评论