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