2

目前我正在下载用户选择的文件夹中提供的所有图像。所以这个过程包括:

  1. 请求图像的所有缩略图
  2. 请求所有原始图像
  3. 取原件,创建一个retina压缩版来展示

我们需要保留原件的原因是因为我们将在从 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 上运行良好,但 iPad 第 4 代似乎处理速度很慢。

不确定这是否是最好的处理方式,或者我是否应该寻找另一种方法来缩放和压缩原始文件。任何帮助将非常感激。

4

0 回答 0