从 iCloud 获取图像会冻结 UI

Fetch Images From ICloud Will Freeze The UI

我正在使用 BSImagePicker 库在我的应用程序中选择多个图像,当用户 select 存储在 ICloud 上的图像 UI 将冻结在图像选择器控制器上,直到下载图像我试图修复它但没有结果

这是我的代码:

选择图片并在滑块中显示它们

 @IBAction func choose_images(_ sender: Any) {

        bs_presentImagePickerController(vc, animated: true,
                                        select: { (asset: PHAsset) -> Void in
                                            // User selected an asset.
                                            // Do something with it, start upload perhaps?
        }, deselect: { (asset: PHAsset) -> Void in
            // User deselected an assets.
            // Do something, cancel upload?
        }, cancel: { (assets: [PHAsset]) -> Void in

        }, finish: { (assets: [PHAsset]) -> Void in
            // User finished with these assets

            // print(assets.count)

            DispatchQueue.main.async{
                self.imagesource.removeAll()
                self.imagesdata.removeAll()
                for img in assets{

                    self.imagesource.append(ImageSource(image:  self.getUIImage(asset: img)!))
                    self.imagesdata.append(self.getUIImage(asset: img)!)
                }

                self.slider.setImageInputs(self.imagesource)
                self.slider.contentScaleMode = UIViewContentMode.scaleAspectFill
                self.slider.slideshowInterval = 2
                self.slider.zoomEnabled = true
                self.slider.backgroundColor = UIColor.black
                self.slider.pageControlPosition = PageControlPosition.insideScrollView
                let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.didTap))
                self.slider.addGestureRecognizer(recognizer)
            }
        }, completion: nil)


    }

函数 return 所选资产的图像

func getUIImage(asset: PHAsset) -> UIImage? {

        var img: UIImage?
        let manager = PHImageManager.default()
        let options = PHImageRequestOptions()
        options.version = .original
        options.isNetworkAccessAllowed = true
        options.isSynchronous = true
        options.progressHandler = { (progress, error, stop, info) in
            if(progress == 1.0){
                SVProgressHUD.dismiss()
            } else {

                SVProgressHUD.showProgress(Float(progress), status: "Downloading from iCloud")

            }
        }
        manager.requestImage(for: asset, targetSize:PHImageManagerMaximumSize, contentMode: PHImageContentMode.aspectFit, options: options) { (image, info) in

            img = image
        }

        return img
    }

任何帮助将不胜感激

您的主要问题是您正在同步访问主队列中的远程图像。您需要在后台执行循环。

您需要按如下方式更新 finish 块中的代码:

}, finish: { (assets: [PHAsset]) -> Void in
    DispatchQueue.global().async {
        self.imagesource.removeAll()
        self.imagesdata.removeAll()
        for img in assets {
            if let res = getUIImage(asset: img) {
                self.imagesource.append(ImageSource(image: res))
                self.imagesdata.append(res)
            }
        }

        DispatchQueue.main.async {
            self.slider.setImageInputs(self.imagesource)
            self.slider.contentScaleMode = UIViewContentMode.scaleAspectFill
            self.slider.slideshowInterval = 2
            self.slider.zoomEnabled = true
            self.slider.backgroundColor = UIColor.black
            self.slider.pageControlPosition = PageControlPosition.insideScrollView
            let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.didTap))
            self.slider.addGestureRecognizer(recognizer)
        }
    }

您可能还需要更新 getUIImage 中的进度处理程序以更新主队列上的 SVProgressHUD。

请注意,使用上面的代码,除了我刚才提到的一项更改外,您应该保留 getUIImage as-is。

只需尝试替换以下代码

for img in assets{

    self.imagesource.append(ImageSource(image:  self.getUIImage(asset: img)!))
    self.imagesdata.append(self.getUIImage(asset: img)!)
}

这个:

for img in assets{
     let image = self.getUIImage(asset: img)!
     self.imagesource.append(ImageSource(image: image))
     self.imagesdata.append(image)
}