Ios UIImagePickerController崩溃“;与资产的连接中断或资产死亡”;

Ios UIImagePickerController崩溃“;与资产的连接中断或资产死亡”;,ios,uicollectionview,uiimagepickercontroller,Ios,Uicollectionview,Uiimagepickercontroller,我一直在努力解决这个令人恶心的问题,但仍然无法找出是什么导致了这次撞车。我从一个按钮实例化相机,然后当用户选择照片时,我将照片添加到我的图像数组并重新加载collectionView。大约20次之后,我在控制台中获得了输出“到资产的连接被中断或资产死亡”,随后出现崩溃。当我从委托方法“didFinishPickingMediaWithInfo”中删除collectionView?.reloadData()方法时,它不会崩溃。这让我非常困惑。见下面的代码: func imagePickerCont

我一直在努力解决这个令人恶心的问题,但仍然无法找出是什么导致了这次撞车。我从一个按钮实例化相机,然后当用户选择照片时,我将照片添加到我的图像数组并重新加载collectionView。大约20次之后,我在控制台中获得了输出“到资产的连接被中断或资产死亡”,随后出现崩溃。当我从委托方法“didFinishPickingMediaWithInfo”中删除collectionView?.reloadData()方法时,它不会崩溃。这让我非常困惑。见下面的代码:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: Dictionary) {
if let image = info["UIImagePickerControllerOriginalImage"] as? UIImage {

images.append(image)

// when i remove this method the app doesnt crash! 
collectionView.reloadData()
collectionView?layoutIfneeded()

dismiss(animated: true, completion: nil)

}
这就是解决方案,请注意压缩大小是硬编码的,您可能需要根据需要调整代码,或者重构并改进方法

func imageCompression(_ imageDict: [String : UIImage]) -> [String : Data] {
    var compressedImages = [String : Data]()

    for (key, value) in imageDict {
        var resizeAttempts = 5
        var compressionRatio: CGFloat = 1
        var imageData = UIImageJPEGRepresentation(value, compressionRatio)

        if imageData?.count <= 90000 {
            compressedImages[key] = imageData
        } else {

            while imageData?.count > 90000 && resizeAttempts > 0 {
                resizeAttempts -= 1
                compressionRatio = compressionRatio * 0.5
                imageData = UIImageJPEGRepresentation(value, compressionRatio)
                compressedImages[key] = imageData
                print("image size now is \(imageData?.count)")

            }
        }
    }
    return compressedImages
}
func-imageCompression(imageDict:[String:UIImage])->[String:Data]{
var compressedImages=[String:Data]()
用于imageDict中的(键、值){
var resize=5
var压缩比:CGFloat=1
var imageData=UIImageJPEG表示法(值、压缩比)
如果imageData?计数90000&&resizeAttempts>0{
resizeAttempts-=1
压缩比=压缩比*0.5
imageData=UIImageJPEG表示(值、压缩比)
压缩图像[键]=图像数据
打印(“图像大小现在为\(imageData?.count)”)
}
}
}
返回压缩图像
}

快速搜索表明,
reloadData()
是一种内存密集型方法,我想这在一定程度上可以解释崩溃的原因。它在多次崩溃后向我暗示资源或句柄没有被释放——可能是这样吗?@EdKing。这个答案似乎也有关联@EdKing这与reloadData()占用内存无关,因为我将reloadData()放入另一个按钮,从我的包中插入一个图像,并重新加载了100多次,没有问题,只有在UIImagePickerController的委托方法内调用它时才会发生,Warren Burton,我读过那篇文章,但不是相对的,我按照那篇文章的答案处理我的图片。这个问题确实令人困惑。听起来你需要将更新发送到主线程?这是@WarrenBurtonOn在阅读您的评论时提出的问题,下面是代码。快速搜索表明
reloadData()
是一种内存密集型方法,我想这可以从某种程度上解释崩溃。它在多次崩溃后向我暗示资源或句柄没有被释放——可能是这样吗?@EdKing。这个答案似乎也有关联@EdKing这与reloadData()占用内存无关,因为我将reloadData()放入另一个按钮,从我的包中插入一个图像,并重新加载了100多次,没有问题,只有在UIImagePickerController的委托方法内调用它时才会发生,Warren Burton,我读过那篇文章,但不是相对的,我按照那篇文章的答案处理我的图片。这个问题确实令人困惑。听起来你需要将更新发送到主线程?这是@WarrenBurtonOn在阅读您的评论时提出的问题,下面是代码。