【问题标题】:Swift App Termination removes Kingfisher Disk CacheSwift App Termination 移除 Kingfisher 磁盘缓存
【发布时间】:2020-03-30 21:33:32
【问题描述】:

我的翠鸟缓存有问题。场景:我将图像从 URL 保存到自定义翠鸟缓存。

当我读取给定的 URL 时,它告诉我它首先从内存中获取图像,几秒钟后刷新时从磁盘中获取图像。当我手动关闭应用程序并重新启动时,打开时,翠鸟告诉我缓存磁盘大小为 20MB。 (这是我所期望的)

基本上,缓存始终完美运行,除了:当我将应用程序移至后台时,它会保持打开状态 5-30 分钟,直到 Apple/iOS 将其杀死 (Terminated due to signal 9)出于记忆的原因。当我启动应用程序时,缓存(内存和磁盘)都是空的!这怎么可能?用户和苹果杀应用有什么区别?

【问题讨论】:

  • 这不正是缓存的意义吗?如果有内存问题会被清理吗?所以如果你不想要这个,你必须把你的图像保存在另一个目录中......
  • 最好找出您的应用程序由于内存问题而崩溃或终止的原因。如果您尝试存储超过设备可用内存。如果您的应用程序没有可用内存,Off-course OS 将终止。首先解决你的问题。
  • 嘿@Chris - 部分正确,但这不是翠鸟将内存缓存移动到磁盘的原因吗?磁盘存储不应受到内存问题的影响?
  • 不,因为磁盘存储在临时目录中,也会被清理
  • @Chris 感谢您的澄清,很高兴知道!是否可以将临时目录移动到更永久的目录?

标签: ios swift caching kingfisher


【解决方案1】:

是的,这是可能的。您可以像这样提供目录 url: ImageCache(name: "test", cacheDirectoryURL: url) -> url 可以是您的文档文件夹,例如

【讨论】:

    【解决方案2】:

    内存存储和磁盘存储都有默认的过期设置。内存存储中的图像将在上次访问后 5 分钟后过期(或将在应用程序终止期间删除),而磁盘存储中的图像为一周。您可以通过以下方式更改此值:

    // Memory image expires after 10 minutes.
    cache.memoryStorage.config.expiration = .seconds(600)
    
    // Disk image never expires.
    cache.diskStorage.config.expiration = .never
    

    如果您想在缓存某个图像时覆盖此过期时间,请使用选项传入:

    // This image will never expire in memory cache.
    imageView.kf.setImage(with: url, options: [.memoryCacheExpiration(.never)])
    

    过期的内存缓存将在 2 分钟内被清除。如果您希望它更频繁地发生:

    // Check memory clean up every 30 seconds.
    cache.memoryStorage.config.cleanInterval = 30
    

    source: Kingfisher Cheat Sheet

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多