Swift - Как сохранить память с помощью AlamofireImage/ImageShack?
Я использую Alamofire, AlamofireImage для кэширования изображений с помощью хранилища ImageShack с бэкэндом Firebase. Иногда объем памяти превышает 100 МБ. Я хочу узнать, как улучшить кэширование и масштабирование изображений перед загрузкой. Например, я объявил один общий кеш во всем проекте класса, используя этот AutoPurgingImageCache:
let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)
Есть ли способ определить эти memoryCapacity, предпочитаемый MemoryUsageAfterPurge для экономии памяти? Что они значат именно?
Я использую ниже 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)
Я думаю, что веб-платформа может иметь плохое качество изображения. Поэтому я делаю масштабирование и кэширование после загрузки изображения:
//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)
}
Также мое приложение открывается с использованием 40 МБ памяти. И затем я вижу максимальное максимальное использование 130 МБ, после загрузки и прокрутки, чтобы повернуть назад AutoPurgingImageCache работает и уменьшает использование памяти, но я все еще думаю, что так много.
Что вы посоветуете мне сохранить память в этих условиях? Мне нужны некоторые пояснения, что вы хотите сказать, инструменты или стратегия, чтобы справиться с этим как можно более качественно для каждой платформы.
1 ответ
Вы только что скопировали и вставили код из AlamofireImage:
let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)
1024 байта x 1024 байта x 100 создадут 100 МБ кэш-памяти в памяти. После достижения этого предела размер кэша будет уменьшен до 60 МБ. Если вы не хотите такой большой кэш, просто уменьшите его. Здесь нет "правильного" номера, это зависит исключительно от вашего варианта использования. Я лично использую 20 МБ в кэш-памяти и 100 МБ в кэш-памяти.