缓存中的图像占用的空间比tvos

时间:2016-07-03 01:59:26

标签: swift caching swift2 tvos alamofireimage

Idk为什么我的图像在缓存中占用的尺寸比原始尺寸大。我正在使用alamofireImage库来实现此目的,我的应用程序是针对tvOS的。这是我的代码。

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


Alamofire.request(.GET, request, headers: headers)
            .responseJSON { response in

                if let JSON = response.result.value {
                    self.imagesArray = JSON["results"] as! NSMutableArray
                    for result in self.imagesArray{

                        self.getNetworkImage(result["url"] as! String, completion: { (UIImage) in

                        })}}}



func getNetworkImage(urlString: String, completion: (UIImage -> Void)) -> (Request) {
        return Alamofire.request(.GET, urlString, headers: headers).responseImage { (response) -> Void in
            guard let image = response.result.value else { return }
            completion(image)
            if response.response?.statusCode == 200{
                self.cacheImage(image, urlString: urlString)
                self.cachedImagesOnly.addObject(urlString)
            }
            if self.counter == 4{
               self.activityIndicatorView.stopAnimating()
               self.activityIndicatorView.hidden = true

                var downloadedImage = UIImage()
                let dicr = self.cachedImagesOnly.firstObject
                 let urlStringFetch = dicr!["url"] as! String
                print("Fetching url: \(urlStringFetch)")

                downloadedImage = self.cachedImage(urlStringFetch)!
                print("Size of image from cache: \(downloadedImage.size)")
                self.ssImage.image = downloadedImage

                })

            }

        }
    }

func cacheImage(image: Image, urlString: String) {

        print("Total Cache memory size: \(self.photoCache.memoryCapacity)")
        self.counter += 1
        let jpgImageData = UIImageJPEGRepresentation(image, 1.0)
        print("Image size before cache : \(jpgImageData?.length)")
        self.cachedImagesOnly.addObject(urlString)
        let URLRequest = NSURLRequest(URL: NSURL(string: "\(urlString)")!)
        self.photoCache.addImage(UIImage(data: jpgImageData!)!, forRequest: URLRequest)
        print("Cache memory usage after image cache: \(self.photoCache.memoryUsage)")

    }

记录结果:

Total Cache memory size: 104857600
Image size: (1752.0, 1896.0) and string as identifier: http://image.com/9493.jpg
Image size before cache : Optional(1738247)
Cache memory usage after image cache: 13287168
Total Cache memory size: 104857600
Image size: (2875.0, 3872.0) and string as identifier: http://image.com/5025.jpg
Image size before cache : Optional(7049508)
Cache memory usage after image cache: 57815168
Total Cache memory size: 104857600
Image size: (2394.0, 3866.0) and string as identifier: http://image.com/169215.jpg
Image size before cache : Optional(6049349)
Cache memory usage after image cache: 94835984
Total Cache memory size: 104857600
Image size: (3811.0, 3049.0) and string as identifier: http://image.com/786.jpg
Image size before cache : Optional(2848557)
Cache memory usage after image cache: 46478956

所以,我在GitHub上读到,当缓存内存已满时,他们使用FIFO,除了删除第一个对象,它根据计算删除了两个或三个。而且,只考虑第一个日志结果,图像大小是1738247和IDK这是什么开销,它在缓存后使用大小变为13287168几乎是非常奇怪的13倍。如果有人遇到这个问题或者能够识别出我的错误,将会非常感激。提前致谢。

1 个答案:

答案 0 :(得分:5)

这有点复杂,因为这里有很多活动部分:

  • 首先,当您从Web服务获取图像时,会有原始资产NSData。在您的代码段中,我不认为您曾经看过这个原始资产,因为您在交付给您之前让Alamofire将其转换为UIImage(请参阅下一点)。但如果您在网络浏览器(或Charles或WireShark等工具)中观看此内容,则这是原始资产的大小。

  • 然后将其转换为UIImage,如果原始资产已经过压缩,则可能会保留压缩状态,直到您首次在UIImageView中使用它为止。

    一旦你使用这个UIImage,它就会被解压缩,通常占用更多的内存,通常是每个像素四个字节(分别为红色,绿色,蓝色和alpha通道的一个字节,不过还有其他格式,也是)。

  • 稍后致电UIImageJPEGRepresentation时,您正在构建NSData的新UIImage。人们经常错误地认为这与原始资产相同,但事实并非如此。如果您使用1.0的压缩质量,这通常比原始资产大得多(虽然可能小于未压缩的UIImage。)如果您使用较低的压缩质量,大小通常更合理,但您介绍一些JPEG工件由于其有损压缩。 (PNG压缩是无损的,但通常产生的资产更大。)

所以,你要比较NSData表示(特别是{1}}为1的JPEG)与compressionQuality占用的内存量的长短不一样缓存,我不希望这些数字匹配。他们是非常不同的东西。