【问题标题】:Swift - How to save memory using AlamofireImage/ImageShack?Swift - 如何使用 AlamofireImage/ImageShack 节省内存?
【发布时间】:2016-07-19 19:24:42
【问题描述】:

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

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(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 内存使用打开。并且比我看到的最大 最高使用量 130MB,在上传和滚动后返回 AutoPurgingImageCache 工作并减少内存使用,但我认为仍然很多。

你对我有什么建议在这些情况下节省内存?我需要一些解释,你想说什么工具或策略来尽可能地处理每个平台的质量。

【问题讨论】:

    标签: ios swift alamofire image-caching alamofireimage


    【解决方案1】:

    您刚刚复制并粘贴了 AlamofireImage 中的代码:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2017-02-18
      相关资源
      最近更新 更多