美文网首页
[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