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

你可能感兴趣的:(GCD同一个界面多个请求完成之后统一刷新)