這種東西,面試問的人很多,但是基本答案都是用隊(duì)列組,用柵欄什么的
這種,最lowB的方法就是自己寫個(gè)變量,每次請求+1.回調(diào)完了-1,每次回調(diào)回來調(diào)用刷新方法去判斷.當(dāng)然了很low
也有很多人直接回答隊(duì)列組的概念,創(chuàng)建個(gè)隊(duì)列加到組里,巴拉巴拉
但是有個(gè)問題,AFN自動(dòng)開啟子線程的,他相當(dāng)于在你創(chuàng)建的子線程里又開了子線程,你這個(gè)隊(duì)列組只檢測了你自己的子線程,他串行走下來,是管不了AFN的子線程的.
同理,用柵欄也是這樣
還是有解決辦法的,但是思路,其實(shí)跟第一種lowB方法的思路是一樣的,只是GCD給你提供了方法而已
第一種用信號(hào)量的,這個(gè)方法,我個(gè)人覺得...挺不好記得....我們還是用第二種簡單點(diǎn)的吧,不說了,上代碼
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()
})
}
}
首先明確,創(chuàng)建隊(duì)列組的方法
let group = DispatchGroup()
每次請求之前,加入隊(duì)列,計(jì)數(shù)加一
group.enter()
每次請求回調(diào)回來,離開隊(duì)列,計(jì)數(shù)減一
group.leave()
統(tǒng)一回調(diào)
group.notify(queue: DispatchQueue.main) {
print("刷新")
}
就這么簡單