目前,我正在努力下载用户所选文件夹中提供的所有图片。所以这个过程包括:
我们需要保留原件的原因是因为这是我们将在8x10相框到40x40帆布包装上打印的文件,所以拥有原件非常重要。造成崩溃的唯一部分是获取原始版本并创建压缩版本。我最终使用了这个:
autoreleasepool({
self.compressed = self.saveImageWithReturn(image:self.original!.scaledImage(newSize: 2048), type: .Compressed)
})
通过调用缩放图像:
func scaledImage(newSize newHeight : CGFloat) -> UIImage {
let scale = newHeight / size.height
let newWidth = size.width * scale
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
drawInRect(CGRectMake(0, 0, newWidth, newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
使用以下方法将图像保存到设备文档中:
private func saveImageWithReturn(image img: UIImage, type: PhotoType) -> UIImage? {
guard let path = ASSET_PATH.URLByAppendingPathComponent(type.rawValue).path,
let imageData = UIImageJPEGRepresentation(img, type.compression())
else { return nil }
imageData.writeToFile(path, atomically: true)
return UIImage(data: imageData)
}
autoreleasepool
实际上解决了它崩溃的问题,但是它在主线程上运行基本上冻结了所有用户交互。然后我试了
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
autoreleasepool({
self.compressed = self.saveImageWithReturn(image: self.original!.scaledImage(newSize: 2048), type: .Compressed)
})
})
导致它无法正确释放内存并崩溃。之所以我认为这种情况正在发生,是因为它没有足够快地处理scaledImage(newSize: 2048)
导致多个请求堆叠并且所有尝试处理这个并且让多个实例都试图保留原始图像将导致内存警告或从它崩溃。到目前为止,我知道它在iPad Air 2上运行得很好,但是第4代iPad似乎处理得很慢。
不确定这是否是最好的处理方式,或者我是否应该找到另一种缩放和压缩原始文件的方法。任何帮助都会非常感激。