使用GCD实现多线程同步

问题引出

在实际开发中,APP首页的数据经常是由多个请求返回的,在下拉刷新内容的时候是需要在接收到这几个并发请求的返回数据之后才把下拉刷新的头部结束刷新,恢复正常状态,这个时候就需要实现线程的同步了。

解决方法

GCD中处理多个线程同步问题的函数有3个:dispatch_group_t 、dispatch_barrier_async、dispach_semaphore,各有各的适用环境:

1.> dispatch_group_t比较适合同步多个线程的操作, 在各个线程的任务完成后,使用dispatch_group_notify函数接收组队列通知即可.

2.> dispatch_barrier比较适合对于同一个并发队列,使队列中前几个任务完成后再执行后面的并发任务,有点类似于NSOperation里面的设置依赖.

3.> dispach_semaphore信号量是比较适合用来控制最大并发任务数的,信号量相当于可以当前可以执行的任务数,使用dispatch_semaphore_wait函数来等待信号量,当信号数大于0时才会开始执行并且使信号量减1.

所以开始提出的问题使用组队列能更方便的解决.


实际代码

 // 创建线程组,以便同步这3个请求
       self.groupQueue = dispatch_group_create();
            
        [self sendRequest1];
        [self sendRequest2];
        [self sendRequest2];
        dispatch_group_notify(self.groupQueue, dispatch_get_main_queue(), ^{
                DLOG(@"结束了3个请求");
                self.groupQueue = nil;
                [self.tableView.mj_header endRefreshing];
           });

实际发送请求时调用的函数 dispatch_group_enter(self.groupQueue)dispatch_group_leave(self.groupQueue)

#pragma mark - 轮播广告相关
- (void) sendRequest1 {
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    @weakify(self);
    if (self.groupQueue) {
        dispatch_group_enter(self.groupQueue);
    }
    [[NetworkingManager new] sendHttp:CM020 content: params controller:nil animate:NO completion:^( NSDictionary *backContentDict) {
        @strongify(self);
        if (self.groupQueue) {
            dispatch_group_leave(self.groupQueue);
        }
       // do some thing
       
    } error:^(NSError *error) {
        @strongify(self);
        if (self.groupQueue) {
            dispatch_group_leave(self.groupQueue);
        }

       // do some thing
    }];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 11,383评论 1 14
  • 文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。通过本文,您将了解到: 1. GCD 简介 2. G...
    晓_我想去环游世界阅读 4,860评论 2 8
  • 可能父爱如山的意思是,沉重且高远。 至少我的父亲是这样。 父亲翻阅了很多字典,最后给我取名“凤“,”身无彩凤双飞翼...
    陈迷呀阅读 1,873评论 0 5
  • 今天继续学习产权的第三种保护原则,不可转让原则。 不可转让原则之所以实施有各种各样的原因,而我们经济学分析的重点,...
    尘世书童阅读 2,915评论 2 1

友情链接更多精彩内容