GCD多线程学习

1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。

     2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。

     3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。

     

     当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。

     

     serial queues通过dispatch_queue_create创建,可以使用函数dispatch_retaindispatch_release去增加或者减少引用计数。

     for (int i = 0 ; i < 10; i++) {

     //使用并列线程去下载图片,同时调用主线程去刷新界面,因为ui属于主线程

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

        // 处理耗时操作的代码块...

        UIImage *img = [self getImgeWith:[urlArr objectForIndex:i]];

        

     //通知主线程刷新

     dispatch_async(dispatch_get_main_queue(), ^{

        //回调或者说是通知主线程刷新,

        [myImgV[i] setImage:img];

     });

     

     

     下载这些图片,然后对这些图片进行处理,就需要等待全部下载完成之后再进行处理,所以需要等待其全部下载完成。使用函数dispatch_group_async来将block提交至一个dispatch queue,同时将它们添加至一个组。所以我们现在可以重新代码:

     下边是一个例子

     dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_group_t group = dispatch_group_create();

     for(id obj in array)

        dispatch_group_async(group, queue, ^{

        [self doSomethingIntensiveWith:obj];

        });

        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

        dispatch_release(group);

        [self doSomethingWith:array];

     });

     dispatch_queue_t 可以作为线程的对象

     如果这些工作可以异步执行,那么我们可以更风骚一点,将函数-doSomethingWith:放在后台执行。我们使用dispatch_group_async函数建立一个block在组完成后执行:

     

     dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_group_t group = dispatch_group_create();

    for(id obj in array)

        dispatch_group_async(group, queue, ^{

        [self doSomethingIntensiveWith:obj];

        });

     dispatch_group_notify(group, queue, ^{

        [self doSomethingWith:array];

        });

     dispatch_release(group);

     

原文地址:https://www.cnblogs.com/AbelChen1991/p/3671742.html