删除未引用的未使用的持久数据

Delete unused persistent data without reference

我有一个与服务器通信的应用程序。在这个应用程序中,我有一个表格视图,其中显示了我公司的几个人(他们的名字和姓氏以及他们的个人资料图片)。

每次打开表视图或需要刷新时,我都会从我的服务器获取用户列表。这些用户都有一个 image_name,我尝试在应用程序本身的数组中查找它。如果我在那里找不到它,我会从文档目录加载它,如果我在那里也找不到它,我会从我的服务器下载它并保存在设备本地以防止将来下载。

这非常有效,并且是管理用户及其图片的一种非常简单的方法,如果多个用户拥有相同的图片(例如公司徽标,但他们没有),它还确保我只下载一次图片我还没有上传图片)。

问题是我没有保留对这些用户的引用,因此该应用不知道哪个用户使用了哪个图像,或者即使图像仍在使用中也是如此。

所以当 A 拥有图像 X 时,它将被下载到 iPhone。如果用户 A 然后将他的图像更改为 Y,应用程序将正确下载并显示图像 Y。但是,图像 X 永远不会从持久数据中删除。

我问你,Whosebug 社区,处理这个问题的最佳方法是什么?

  1. 我是否应该开始保留对我的用户的引用,以便我也可以保留对旧图像的引用?
  2. 有什么方法可以找到上次从文档目录读取图像的时间戳吗?
  3. 我是否应该将图像名称存储在 coreData 以及对它们的所有引用中? (某种自定义 ARC 逻辑)
  4. ...

您可以为下载的图像添加前缀,当您获取图像时,检查永久存储中的所有图像是否有此前缀,如果有则删除。每次客户端获取时,您应该只需要删除(最多)一张图像,这对客户端来说不会太重。

在某个时间点您有使用过的图像列表,此时您还有一个保存到磁盘的图像列表。每天一次,您可以获取此信息,并在后台线程上对已使用和已保存的信息进行比较,然后将其删除。这应该不需要任何额外的数据存储。

如果您想让图像在停止使用后保留一段时间,您可以在每次使用文件时 'touch' 文件(更新 fileModificationDate),然后稍后您可以查看所有图片的修改日期,并据此删除。