我的场景是这样的。我需要发送一个网络请求,作为回应,我将成为一个图像URL列表。然后,我需要同时发送多个网络请求来获得所有这些图像,一旦下载了所有图像,我就需要填充一个tableView
。
为了满足这些要求,我正在努力理解Playground中DispatchQueue
和DispatchGroup
之间的关系,到目前为止,这是我的代码。
var concurrentQueue = DispatchQueue(label: "test",attributes: .concurrent)
var myGroup = DispatchGroup()
var mySecondGroup = DispatchGroup()
myGroup.notify(queue: DispatchQueue.main) {
print("Initial Json request with List of URLs completed")
mySecondGroup.enter()
concurrentQueue.async {
for i in 10...15 {
print(i)
if(i==15){
mySecondGroup.leave()
}
}
}
}
mySecondGroup.notify(queue: DispatchQueue.main) {
print("All Images download complete")
}
myGroup.enter()
concurrentQueue.async {
for i in 0...5 {
print(i)
if(i==5){
myGroup.leave()
}
}
}
问题是我正在得到的结果
0
1
2
3
4
5
Initial Json request with List of URLs completed
10
11
All Images download complete
12
13
14
15
但我想要的是类似的东西
0
1
2
3
4
5
Initial Json request with List of URLs completed
10
11
12
13
14
15
All Images download complete
我真的不明白我在这里做错了什么,任何帮助都将不胜感激。
DispatchQueue
是调度任务的介质。
DispatchGroup
的工作原理与计数器类似。调用enter
使计数器递增(通常在调用异步任务之前(,leave
使计数器递减(通常在完成处理程序内(。当计数器达到零时,组会通知。
您的场景需要类似的东西
let concurrentQueue = DispatchQueue(label: "test",attributes: .concurrent)
let group = DispatchGroup()
concurrentQueue.async {
asynchronousAPI.call() { urls in
for url in urls {
group.enter()
asynchronousImageLoad(url) { data in
// process data
group.leave()
}
}
}
}
group.notify(queue: .main) {
print("done")
}