这种东西,面试问的人很多,但是基本答案都是用队列组,用栅栏什么的
这种,最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("刷新")
}
就这么简单