美文网首页
[iOS] 常用的GCD

[iOS] 常用的GCD

作者: manajay | 来源:发表于2018-04-26 14:26 被阅读14次
/**
 * 异步具备开线程的能力, 同步不具有
 * 串行: 任务一个接一个, 依次执行
 * 并发: 任务不相互依赖, 同时执行
 */

/**
  * 快速迭代遍历 ,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

相关文章

网友评论

      本文标题:[iOS] 常用的GCD

      本文链接:https://www.haomeiwen.com/subject/teoplftx.html