翠鸟中奇怪的 RAM 行为
Strange RAM behavior in Kingfisher
我用Kingfisher加载图片到Card View(UIView
),和tinder一样,我设置Kingfisher缓存图片到磁盘,但是在卡片分页的时候,内存消耗从 39 兆字节急剧增加到 247 并在一段时间后再次变为 39,但问题是当内存被释放时,在应用程序中一秒钟 UI 变慢(我认为这是被主线程阻塞) .此问题类似于 this one. 我该如何解决?
我在didFinishLaunchingWithOptions
AppDelegate
中设置了Kingfisher的设置
fileprivate func setupKingfisherSettings() {
let megabytes: UInt = 300
ImageCache.default.maxDiskCacheSize = megabytes * 1024 * 1024
ImageCache.default.maxMemoryCost = 1
}
代码片段。当我删除这段代码时,这个问题没有发生。
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")
}
}
更新::我发现发生这种情况时有规律可循。当 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
}
}
在我解决问题的那一刻,我编写了自定义 CacheSerializer,并将图像压缩到 3 兆字节。但我对其他答案感兴趣,如何解决这个问题。
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)
}
}
我用Kingfisher加载图片到Card View(UIView
),和tinder一样,我设置Kingfisher缓存图片到磁盘,但是在卡片分页的时候,内存消耗从 39 兆字节急剧增加到 247 并在一段时间后再次变为 39,但问题是当内存被释放时,在应用程序中一秒钟 UI 变慢(我认为这是被主线程阻塞) .此问题类似于 this one. 我该如何解决?
我在didFinishLaunchingWithOptions
AppDelegate
中设置了Kingfisher的设置
fileprivate func setupKingfisherSettings() {
let megabytes: UInt = 300
ImageCache.default.maxDiskCacheSize = megabytes * 1024 * 1024
ImageCache.default.maxMemoryCost = 1
}
代码片段。当我删除这段代码时,这个问题没有发生。
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")
}
}
更新::我发现发生这种情况时有规律可循。当 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
}
}
在我解决问题的那一刻,我编写了自定义 CacheSerializer,并将图像压缩到 3 兆字节。但我对其他答案感兴趣,如何解决这个问题。
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)
}
}