首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环期间执行的外部循环代码

循环期间执行的外部循环代码
EN

Stack Overflow用户
提问于 2020-11-10 10:49:39
回答 1查看 169关注 0票数 0

我试图检索用户在PHPicker中选择的一组图像,并将它们存储在一个数组中。我正在迭代PHPicker结果数组,并在每次迭代中将加载的图像附加到变量中。出于某种原因,在迭代完成之前会调用此迭代之后的代码。我尝试过while和for循环,删除了DispatchQueue.main.async,似乎没有什么改变调用的顺序。很明显,我做错了什么,但我真的不明白。

代码语言:javascript
复制
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()图像:[]图像:图片:图像:图片:,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-15 01:29:36

对于这种异步工作,您需要类似于DispatchGroup的东西。

编辑您的示例以利用它

代码语言:javascript
复制
    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")
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64767451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档