我试图检索用户在PHPicker中选择的一组图像,并将它们存储在一个数组中。我正在迭代PHPicker结果数组,并在每次迭代中将加载的图像附加到变量中。出于某种原因,在迭代完成之前会调用此迭代之后的代码。我尝试过while和for循环,删除了DispatchQueue.main.async,似乎没有什么改变调用的顺序。很明显,我做错了什么,但我真的不明白。
var itemProviders: [NSItemProvider] = []
var iterator: IndexingIterator<[NSItemProvider]>?
var images = [UIImage]()
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
itemProviders = results.map(\.itemProvider)
iterator = itemProviders.makeIterator()
while let itemProvider = iterator?.next(), itemProvider.canLoadObject(ofClass: UIImage.self) {
print("\n Entered while")
itemProvider.loadObject(ofClass: UIImage.self) { image, error in
DispatchQueue.main.async {
guard let image = image as? UIImage else { return }
self.images.append(image)
print("Image: \(image)")
print("Images: \(self.images)")
}
}
}
displayAndStoreImages()
}
func displayAndStoreImages(){
print("\n Entered displayAndStoreImages()")
print("Images: \(images) \n")
(...)
}这是在PHPicker中选择2幅图像的结果。执行2次迭代,但不执行迭代块中的代码。相反,将执行以下代码,只有在此之后,迭代块中的代码才会被调用。为什么在循环期间执行循环外的代码?提亚
输入时输入displayAndStoreImages()图像:[]图像:图片:图像:图片:,
发布于 2020-11-15 01:29:36
对于这种异步工作,您需要类似于DispatchGroup的东西。
编辑您的示例以利用它
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
itemProviders = results.map(\.itemProvider)
iterator = itemProviders.makeIterator()
let dispatchGroup = DispatchGroup()
while let itemProvider = iterator?.next(), itemProvider.canLoadObject(ofClass: UIImage.self) {
dispatchGroup.enter()
print("\n Entered while")
itemProvider.loadObject(ofClass: UIImage.self) { image, error in
DispatchQueue.main.async {
guard let image = image as? UIImage else { return }
self.images.append(image)
print("Image: \(image)")
print("Images: \(self.images)")
dispatchGroup.leave()
}
}
}
dispatchGroup.notify(queue: DispatchQueue.main) {
self.displayAndStoreImages()
}
}
func displayAndStoreImages(){
print("\n Entered displayAndStoreImages()")
print("Images: \(images) \n")
}https://stackoverflow.com/questions/64767451
复制相似问题