【发布时间】:2018-12-01 16:46:47
【问题描述】:
我已设置此脚本以在后台循环遍历一堆数据,并且我已成功设置信号量以保持所有内容(将填充表格的数组)有序,但我无法完全理解如何或为什么信号量保持数组有序。输入dispatchGroup,循环停止并等待直到下载图像,一旦获得图像,dispatchSemaphore 设置为1,然后立即退出dispatchGroup,信号量设置回0 .信号量从 0 切换到 1 太快了,我不明白它是如何保持数组有序的。
let dispatchQueue = DispatchQueue(label: "someTask")
let dispatchGroup = DispatchGroup()
let dispatchSemaphore = DispatchSemaphore(value: 0)
dispatchQueue.async {
for doc in snapshot.documents {
// create data object for array
dispatchGroup.enter()
// get image with asynchronous completion handler
Storage.storage().reference(forURL: imageId).getData(maxSize: 1048576, completion: { (data, error) in
defer {
dispatchSemaphore.signal()
dispatchGroup.leave()
}
if let imageData = data,
error == nil {
// add image to data object
// append to array
}
})
dispatchSemaphore.wait()
}
// do some extra stuff in background after loop is done
}
dispatchGroup.notify(queue: dispatchQueue) {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
【问题讨论】:
标签: swift grand-central-dispatch semaphore