GCD同一个界面多个请求完成之后统一刷新

这种东西,面试问的人很多,但是基本答案都是用队列组,用栅栏什么的

这种,最lowB的方法就是自己写个变量,每次请求+1.回调完了-1,每次回调回来调用刷新方法去判断.当然了很low

也有很多人直接回答队列组的概念,创建个队列加到组里,巴拉巴拉
但是有个问题,AFN自动开启子线程的,他相当于在你创建的子线程里又开了子线程,你这个队列组只检测了你自己的子线程,他串行走下来,是管不了AFN的子线程的.
同理,用栅栏也是这样

还是有解决办法的,但是思路,其实跟第一种lowB方法的思路是一样的,只是GCD给你提供了方法而已

第一种用信号量的,这个方法,我个人觉得...挺不好记得....我们还是用第二种简单点的吧,不说了,上代码

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        groupSync()
    }
    
    func groupSync() {
        let group = DispatchGroup()
        
        group.enter()
        request1(group: group)
        group.enter()
        request2(group: group)
        group.enter()
        request3(group: group)
        
        group.notify(queue: DispatchQueue.main) {
            print("------------")
            print("------------")
            print("------------")
            print("刷新")
        }
        
    }
    
    func request1(group: DispatchGroup) {
        AFHTTPSessionManager().get("http://www.baidu.com", parameters: nil, progress: nil, success: { (task, result) in
            
            print("success1")
            print(task)
            print(result ?? "request1")
            print("__________________")
            group.leave()
        }, failure: { (task, error) in
            print("error1")
            print(task ?? "request")
            print(error)
            print("__________________")
            group.leave()
        })
    }
    
    func request2(group: DispatchGroup) {
        AFHTTPSessionManager().get("http://www.baidu.com", parameters: nil, progress: nil, success: { (task, result) in
            
            print("success2")
            print(task)
            print(result ?? "request2")
            print("__________________")
            group.leave()
        }, failure: { (task, error) in
            print("error2")
            print(task ?? "request2")
            print(error)
            print("__________________")
            group.leave()
        })
    }

    func request3(group: DispatchGroup) {
        AFHTTPSessionManager().get("http://www.baidu.com", parameters: nil, progress: nil, success: { (task, result) in
            
            print("success3")
            print(task)
            print(result ?? "request3")
            print("__________________")
            group.leave()
        }, failure: { (task, error) in
            print("error3")
            print(task ?? "request3")
            print(error)
            print("__________________")
            group.leave()
        })
    }
}

首先明确,创建队列组的方法

  let group = DispatchGroup()

每次请求之前,加入队列,计数加一

group.enter()

每次请求回调回来,离开队列,计数减一

group.leave()

统一回调

group.notify(queue: DispatchQueue.main) {
            print("刷新")
        }
        

就这么简单

github地址
https://github.com/XHJiang/GCD_someRequest.git

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

推荐阅读更多精彩内容

  • 41.多用派发队列,少用同步锁 在Objective-C中,如果有多个线程要执行同一份代码,那么有时可能会出问题。...
    Code_Ninja阅读 4,871评论 1 13
  • 1.请简单说明多线程技术的优点和缺点? 优点能适当提高程序的执行效率能适当提高资源的利用率(CPU/内存利用率) ...
    彼岸的黑色曼陀罗阅读 3,375评论 0 2
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 7,787评论 1 17
  • 有的时候你帮助了别人,虽然你的本意不是要求别人回报给你什么,但是如果ta一句谢谢也没有的话,你心里肯定会有疙瘩,这...
    就爱星座阅读 3,790评论 0 0
  • 春分时节将至,岛城的阳光也暖了起来。走在路上和朋友聊起了童年时候的趣事,心里也像倾进了一缕温馨。离我已经很远的欢笑...
    宋予屿阅读 2,118评论 1 5