Swift - 如何使用 AlamofireImage/ImageShack 节省内存?
Swift - How to save memory using AlamofireImage/ImageShack?
我正在使用 Alamofire,AlamofireImage 使用 ImageShack 存储缓存图像 Firebase 后端。有时内存超过 100MB。我想了解如何在上传前改进我的图像缓存和缩放比例。例如,我在 class 整个项目中使用 AutoPurgingImageCache:
声明了一个公共缓存
let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)
有没有办法定义这些memoryCapacity, preferredMemoryUsageAfterPurge来节省内存?它们到底是什么意思?
我在下面使用 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(image, 0.25)! 不是很好的压缩案例,我的图片来自互联网,是全尺寸的。如果我在压缩之前缩放以上传:
let size = CGSize(width: 500.0, height: 273.0)
let scaledImage = image.af_imageScaledToSize(size)
我认为网络平台的图像质量可能很差。所以我在图片下载后进行缩放和缓存:
//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 内存。而且我看到最大 top 使用 130MB,在上传和滚动返回后 AutoPurgingImageCache 工作并减少内存使用,但我认为仍然很多。
在这些情况下,您有什么建议 来节省内存?我需要一些解释,你想说什么工具或策略来处理它,尽可能为每个平台提供高质量。
您刚刚复制并粘贴了 AlamofireImage 中的代码:
let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)
1024 字节 x 1024 字节 x 100 将创建一个 100 MB 的内存缓存。达到该限制后,缓存大小将减少到 60 MB。如果您不想要这么大的缓存,那么就减少它。这里没有 "correct" 数字,这完全取决于您的用例。我个人使用 20 MB 内存缓存和 100 MB 磁盘缓存。
我正在使用 Alamofire,AlamofireImage 使用 ImageShack 存储缓存图像 Firebase 后端。有时内存超过 100MB。我想了解如何在上传前改进我的图像缓存和缩放比例。例如,我在 class 整个项目中使用 AutoPurgingImageCache:
声明了一个公共缓存let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)
有没有办法定义这些memoryCapacity, preferredMemoryUsageAfterPurge来节省内存?它们到底是什么意思?
我在下面使用 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(image, 0.25)! 不是很好的压缩案例,我的图片来自互联网,是全尺寸的。如果我在压缩之前缩放以上传:
let size = CGSize(width: 500.0, height: 273.0)
let scaledImage = image.af_imageScaledToSize(size)
我认为网络平台的图像质量可能很差。所以我在图片下载后进行缩放和缓存:
//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 内存。而且我看到最大 top 使用 130MB,在上传和滚动返回后 AutoPurgingImageCache 工作并减少内存使用,但我认为仍然很多。
在这些情况下,您有什么建议 来节省内存?我需要一些解释,你想说什么工具或策略来处理它,尽可能为每个平台提供高质量。
您刚刚复制并粘贴了 AlamofireImage 中的代码:
let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)
1024 字节 x 1024 字节 x 100 将创建一个 100 MB 的内存缓存。达到该限制后,缓存大小将减少到 60 MB。如果您不想要这么大的缓存,那么就减少它。这里没有 "correct" 数字,这完全取决于您的用例。我个人使用 20 MB 内存缓存和 100 MB 磁盘缓存。