我正在尝试使用调度背景在集合视图中使用本地标识符来获取资产,但是加载和单元格为空需要太多时间

时间:2017-07-27 09:23:49

标签: swift uicollectionview grand-central-dispatch phasset

我正在尝试使用从单元格中的本地标识符获取资产来从本地标识符加载资产 在后台线程中的indexpath并将其显示在集合视图单元格中,但是加载需要太多时间,单元格为零。有数百个图像。这里有代码。

这种方法对于获取cellfor indexpath中的资产是否正确?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GridCell", for: indexPath) as! GridCell

cell.representedAssetIdentifier = "localidentifier"

    DispatchQueue.main.async() {
                if let cachedImage = self.imageCache.object(forKey: localidentifier! as NSString) as? UIImage {
                    cell.image  = cachedImage

                }
            }

            //let asset = self.assetsByDate[indexPath.section].1[indexPath.row]
            DispatchQueue.global(qos: .background).async {
                 let asset = PHAsset.fetchAssets(withLocalIdentifiers: [localidentifier!], options: .none).firstObject
                let mystring  = String(describing: asset)
                //print("the asset to string \(mystring)")
               // print ("String to asset \( mystring as! PHAsset)")


                self.imageManager.requestImage(for:  asset!, targetSize: self.thumbnailSize, contentMode: .aspectFit, options: PHImageRequestOptions(), resultHandler: { result, info in
                    if cell.representedAssetIdentifier =="localidentifier" {
                        DispatchQueue.main.async() {

                            DispatchQueue.main.async() {


                                if let image = result {
                                    self.imageCache.setObject(image, forKey:localidentifier!  as NSString)
                                    cell.image= image
                                }

                            }
                        }

                    }
                })

            }

1 个答案:

答案 0 :(得分:0)

即使您在后台线程中加载图像(这是一个好点),单元格也不应该为零。所以我认为问题并不完全存在。

在您的情况下,即使图像仍在加载,该方法也应返回带有ImageView的单元格。 然后,当加载结束时,它应该在imageView中显示图像。

问题也可能来自关于主线程的重复行:

DispatchQueue.main.async() {
    DispatchQueue.main.async() {

您应该删除其中一个。 您还必须使用弱引用来避免零异常或泄漏:

DispatchQueue.main.async() { [weak self] in
    if let image = result {
        self.imageCache.setObject(image, forKey:localidentifier!  as NSString)
    cell.image= image
    }
}