GCD实现异步任务---赵永洪笔(p小姐和z先森的故事)

有时候我们会有这种需求:为了执行下载任务,开启了多个异步任务,需要在在这些异步任务都完成之后执行接下来的操作。这个时候,就需要用到异步任务的同步。 

iOS中GCD为我们提供了实现方式,就我所知有以下两种,如果各位大神还有其他实现方式还请赐教: 



一、dispatch_group实现

//创建一个全局队列,优先级设置为默认dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//创建异步任务组,接下来将多个异步任务添加到这个任务组中dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{

    // 异步任务1});

dispatch_group_async(group, queue, ^{

    // 异步任务2

});// 等待添加到group中的多个异步任务执行完毕后执行一些操作,有两种方式// 方式1(不推荐,会卡住当前线程)

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// 方式2(推荐,意思是当任务组中任务都完成会给系统发送一个通知,然后进行其他操作)dispatch_group_notify(group, mainQueue, ^{

    // 任务完成后,在主队列中做一些操作

});



二、dispatch_barrier_async实现 

dispatch_barrier_async的作用用一个词概括就是“承上启下”。它会等待在它之前的异步任务先执行,同时它之后的任务也需要等待它执行完成。基于这种特性,可以实现多个异步任务的同步操作。

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

    // 任务1});

dispatch_async(queue, ^{

    // 任务2});

dispatch_async(queue, ^{

    // 任务3});

dispatch_barrier_async(queue, ^{

    // 任务4});

dispatch_async(queue, ^{

    // 任务5});

dispatch_async(queue, ^{

    // 任务6});

在这段代码中,任务4要等待任务1、2、3的完成,任务5、6等待任务4的完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。