Kingfisher中的奇怪RAM行为

问题描述:

我使用Kingfisher将图像加载到卡片视图(UIView)中,就像在启动时一样,我将Kingfisher设置为将图像缓存到磁盘,但在卡片分页过程中,内存消耗增加显着从39兆字节到247,并在一段时间后再次成为39,但问题是,当内存被释放,在第二个用户界面的应用程序变慢(我认为这是由主线程阻止)。这个问题类似于this one.我该如何解决它?Kingfisher中的奇怪RAM行为

didFinishLaunchingWithOptions

fileprivate func setupKingfisherSettings() { 
     let megabytes: UInt = 300 
     ImageCache.default.maxDiskCacheSize = megabytes * 1024 * 1024 
     ImageCache.default.maxMemoryCost = 1 
    } 

代码片段设置设置Kingfisher的AppDelegate。当我删除这段代码时,这个问题没有发生。

private func downloadImages(_ card: CardModel) { 
    if let placeAvatarURLString = card.photoURLsProperties.placePhotoURLs.first { 
     if let placeAvatarURL = URL(string: placeAvatarURLString) { 
      venueImageView.kf.indicatorType = .activity 
      venueImageView.kf.setImage(with: placeAvatarURL) 
     } else { 
      venueImageView.image = UIImage(named: "CardDefaultImage") 
     } 
    } else if let eventLogoURLPath = card.photoURLsProperties.placeLogoURLs.first { 
     if let url = URL(string: eventLogoURLPath) { 
      venueImageView.kf.indicatorType = .activity 
      venueImageView.kf.setImage(with: url) 
     } else { 
      venueImageView.image = UIImage(named: "CardDefaultImage") 
     } 
    } else { 
     venueImageView.image = UIImage(named: "CardDefaultImage") 
    } 
} 

enter image description here

更新时间::我发现了一个规律,当这种情况发生。当ImageCache提取大于5兆字节的图像时,会发生内存跳转。我发现它在这个方法diskImage中使用debugPrint,如果图像大于或等于5兆字节,则会跳转,如果是4兆字节,则一切正常。

我在iPhone 7上测试,超过74 GB的可用内存。

func diskImage(forComputedKey key: String, serializer: CacheSerializer, options: KingfisherOptionsInfo) -> Image? { 
     if let data = diskImageData(forComputedKey: key) { 
      debugPrint("ImageCache data.count", data.count/1024/1024) 
      return serializer.image(with: data, options: options) 
     } else { 
      return nil 
     } 
    } 
+0

请提供代码片段,我也遇到与翠鸟相同的内存问题,并在翠鸟发布问题。似乎有一些问题需要修复,最后我切换到SDWebImage。 – dip

+0

@dip另外我想说的是,我在翠鸟问题中发表了这个问题 – Alexander

+0

@dip我的问题https://github.com/onevcat/Kingfisher/issues/703 – Alexander

目前我解决了我的问题,我写了Custom CacheSerializer,并压缩了3 MB的图像。但我对其他答案感兴趣,如何解决这个问题。

import Kingfisher 

struct AppNameKingfisherCacheSerializer: CacheSerializer { 

    func data(with image: Image, original: Data?) -> Data? { 
     return image.compressToData(3) 
    } 

    func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? { 
     return UIImage(data: data) 
    } 

}