PHCachingImageManager.requestImage 总是被调用两次?

Bol*_*ion 4 ios uicollectionviewcell swift phasset xcode9

我有一个UICollectionView自定义UICollectionViewCell,它应该从UIImageView单元格中的每个照片中获取并显示缩略图(低质量)照片(通常用户可以选择 1 张以上的照片)。

我一直在玩PHImageRequestOptions和它们的属性,阅读它们。我什至nil作为requestImage(for: PHAsset)方法的参数传递了这一点,因为我不确定我错在哪里。

问题是该requestImage(for: PHAsset)方法被调用了两次。我需要第一次调用它只是在每个集合视图单元格中设置图像质量低(缩略图图像),一旦全尺寸图像准备好,它应该被添加到一个名为assetsTurnedIntoImages. 问题是我做错了,我总是得到两次调用ifelse方法,所以基本上,如果我从相机胶卷中选择了 4 张图像(因此,我在资产数组中有 4 张图像)以及何时通过 requestImage(for: asset) 方法我得到 8 个图像assetsTurnedIntoImages而不是 4 个。所以这是我的代码

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        print("Assets count is:", assets.count)
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoPostCVCell", for: indexPath) as! PhotoPostCVCell
        if let takenImage = cameraPhotoUIImage
        {
            cell.cellImage.image = takenImage
        }
        if assets.count > 0
        {
            let asset = assets[indexPath.row]

//            var imageRequestOptions: PHImageRequestOptions
//            {
//                let options = PHImageRequestOptions()
//                //options.version = .current
//                //options.resizeMode = .exact
//                //options.deliveryMode = .fastFormat
//                options.isSynchronous = true
//                return options
//            }
            let targetSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
            imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: nil)
            { (image, info) in
                if image != nil
                {
                    let imageQualityState = info![PHImageResultIsDegradedKey] as! Bool

                    if imageQualityState
                    {
                        print("LOW QUALITY")
                        print("Image Quality State is:", imageQualityState)
                        cell.cellImage.image = image
                        print(image!.size)
                    }
                    else
                    {
                        print(image!.size)
                        cell.cellImage.image = image
                        self.assetsTurnedIntoImages.append(image!)
                    }
                }
            }
        }
        return cell
    }
Run Code Online (Sandbox Code Playgroud)

小智 7

您可以通过包含以下条件来丢弃那些低分辨率重复项:

imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: nil) { (image, info) in

let isDegraded = (info?[PHImageResultIsDegradedKey] as? Bool) ?? false
if isDegraded {
   return
}
Run Code Online (Sandbox Code Playgroud)


NSG*_*ter 1

requestImage:forAsset恐怕对于被叫两次你无能为力。但是,您可以更改将图像放入数组中的方式以避免重复。我可以建议:

self.assetsTurnedIntoImages[indexPath.row] = image
Run Code Online (Sandbox Code Playgroud)

这将导致第二次传递完成的图像来替换第一次调用的图像,从而避免重复。

您需要提前为数组预初始化足够的空间,这样就indexPath.row不会尝试越界访问数组。添加ViewDidLoad一些内容以达到以下效果:

self.assetsTurnedIntoImages = [UIImage](repeating: UIImage(), count: assets.count)
Run Code Online (Sandbox Code Playgroud)