Swift – 如何使用AlamofireImage / ImageShack节省内存?

我正在使用AlamofireAlamofireImage来使用带有Firebase后端的ImageShack存储caching图像。 有时内存超过100MB。 我想在上传之前学习如何改进我的图像caching和缩放比例。 例如,我已经使用该AutoPurgingImageCache在类整个项目中声明了一个公共caching:

let photoCache = AutoPurgingImageCache( memoryCapacity: 100 * 1024 * 1024, preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 ) 

有没有什么办法来定义这些memoryCapacitypreferredMemoryUsageAfterPurge来节省内存? 他们究竟是什么意思?

我正在使用下面的Alamofire.upload didFinishPickingImage

 func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { let urlStr = "http://post.imageshack.us/upload_api.php" let url = NSURL(string: urlStr)! let imgData = UIImageJPEGRepresentation(image, 0.25)! let keyData = "____IMGSHACK_API_KEY_____".dataUsingEncoding(NSUTF8StringEncoding)! let keyJSON = "json".dataUsingEncoding(NSUTF8StringEncoding)! let publicData = "no".dataUsingEncoding(NSUTF8StringEncoding)! Alamofire.upload(.POST, url, headers: nil, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: imgData, name:"fileupload", fileName:"image", mimeType: "image/jpg") multipartFormData.appendBodyPart(data: keyData, name: "key") multipartFormData.appendBodyPart(data: keyJSON, name: "format") multipartFormData.appendBodyPart(data: publicData, name: "public") }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.validate() upload.responseJSON { response in let responseJSON = response.result.value as? [String: AnyObject] if let links = responseJSON!["links"] as? Dictionary<String, AnyObject> { if let imgLink = links["image_link"] as? String { self.postToFirebase(imgLink) print(imgLink) } } } case .Failure(let encodingError): print(encodingError) } }) self.dismissViewControllerAnimated(true, completion: nil) self.tableView.contentOffset = CGPointMake(0, -60); } 

我觉得UIImageJPEGRepresentation(图像,0.25)! 压缩不好的情况下,我的图像来自互联网的全尺寸。 如果我在压缩之前缩放上传,如:

 let size = CGSize(width: 500.0, height: 273.0) let scaledImage = image.af_imageScaledToSize(size) 

我认为networking平台可能是不好的图像质量。 所以我在图像下载后进行缩放和caching:

  //MARK: - Image Downloading func getNetworkImage(urlString: String, comesFrom: String, completion: (UIImage -> Void)) -> (Request) { return Alamofire.request(.GET, urlString).responseImage { (response) -> Void in guard let image = response.result.value else { return } completion(image) if comesFrom == "collectionPage" { self.cacheCollectionImage(image, urlString: urlString) } else if comesFrom == "postPage" { self.cachePostImage(image, urlString: urlString) } } } //MARK: - Image Caching func cacheCollectionImage(image: Image, urlString: String) { let size = CGSize(width: 188.0, height: 120.0) let scaledImage = image.af_imageScaledToSize(size) photoCache.addImage(scaledImage, withIdentifier: urlString) } func cachePostImage(image: Image, urlString: String) { let size = CGSize(width: 300.0, height: 165.0) let scaledImage = image.af_imageScaledToSize(size) photoCache.addImage(scaledImage, withIdentifier: urlString) } func cachedImage(urlString: String) -> Image? { print("cachedImage() func ended") return photoCache.imageWithIdentifier(urlString) } 

另外我的应用程序打开与40MB的内存使用量。 而且我看到最大最高使用130MB ,上传和滚动后回头AutoPurgingImageCache作品和减less内存使用,但我认为还是这么多。

你有什么build议我在这些条件下保存记忆? 我需要一些解释,你想说的工具或策略,以尽可能处理每个平台的质量好。

你只需复制粘贴来自AlamofireImage的代码:

 let photoCache = AutoPurgingImageCache( memoryCapacity: 100 * 1024 * 1024, preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 ) 

1024字节x 1024字节x 100将创build一个100 MB的内存caching。 达到该限制后,caching大小将减less到60 MB。 如果你不想这么大的caching,那么就减less它。 这里没有“正确的”号码,这完全取决于你的用例。 我个人使用了20 MB的内存caching和100 MB的磁盘caching。