将图像从“照片”加载到集合视图会导致出现错误消息“资产连接已中断或资产已损坏”

时间:2015-03-02 10:38:30

标签: ios swift uicollectionview uicollectionviewcell photokit

我正在尝试将用户相册中的所有图像加载到我的应用程序的集合视图中,但在加载其中几个之后,应用程序将自行关闭并返回主菜单。与XCode的连接也断开连接。 这不会发生在模拟器中,只会发生在我测试的iPhone 4s上。 崩溃前出现的错误消息按发生顺序

  1. 收到内存警告
  2. 与资产的连接中断或资产已经死亡。
  3. 我已经找到了我认为导致此问题的代码的几个部分。

    var imgFetchResult: PHFetchResult!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
    
        let fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
    
        if fetchResult.count > 0
        {
            println("images found ? \(fetchResult.count)")
            self.imgFetchResult = fetchResult
        }
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
    {
        println("cellForItemAtIndexPath")
        let cell: PhotoThumbnailCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as PhotoThumbnailCollectionViewCell
    
        println("indexpath is \(indexPath.item)")
    
        if( indexPath.item == 0 )
        {
            cell.backgroundColor = UIColor.redColor() //temp placeholder for camera image
        }
        else
        {
            let asset: PHAsset = self.imgFetchResult[indexPath.item] as PHAsset 
            PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result)
            })
        }
    
        return cell
    }
    

    我相信我需要释放记忆但不知道该怎么做。它似乎是正在加载到集合视图的单元格中的图像。

    我还发现集合视图不超过4个图像。在第4张图像之后,发生了崩溃。此外,图像未按顺序加载。

2 个答案:

答案 0 :(得分:8)

问题出现在这行代码中

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result)
})

参数targetSize传递了PHImageManagerMaximumSize的值,这是罪魁祸首。我将其更改为CGSize(width: 105, height: 105)解决了问题。

根据文档PHImageManagerMaximumSize

  

使用PHImageManagerMaximumSize选项时,Photos提供了   可用于资产的最大图像,无需缩放或裁剪。   (也就是说,它会忽略resizeMode选项。)

所以,这解释了这个问题。我相信如果它是单个图像,它不应该是一个问题,但如果它是很多图像,设备将耗尽内存。

我希望这有助于其他人。

答案 1 :(得分:0)

正如@winhung所说,对我来说这也是规模。我所做的是将目标大小减少一半,例如:

let asset: PHAsset = self.imgFetchResult[indexPath.item] as PHAsset 
let mytargetSize = CGSize(width: asset.pixelWidth/2, height: asset.pixelHeight/2)

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: mytargetSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result)
})