【问题标题】:Caching or Core Data for semi-perminant image and video persistence?用于半永久图像和视频持久性的缓存或核心数据?
【发布时间】:2016-01-13 09:06:15
【问题描述】:

(如果文本很多,请注意底部有一个 TLDR)

我正在研究从服务器中提取和显示图像和视频的东西。基本上考虑不同的文件夹,它们后面有您可以查看的图片和视频。

每个文件夹都会以相当一致的方式更新新图片和视频,因此我希望能够一次存储尽可能多的这些图片和视频,以通过预加载和保存一些数据来最大限度地减少加载/请求数据库的时间.

让我先说我很可能完全错了我在这句话之后写的任何东西。这就是我问的原因。我不是 100% 清楚每种方法的功能

我会尽量安排得井井有条:

要求/用途:

  • 保存大文件(图像和视频数据)以便快速访问(从服务器填充)
  • 已保存数据的快速旋转;不断更新
  • 文件绝对是临时的,我不想显示过期信息,但我不想每次需要查看时都重新加载类似的内容。
  • 需要能够完全存储多个文件夹的数据,例如中高范围的每个文件夹 8-12MB 的文件(如果只有一个可以立即访问并且其余部分仍然必须从数据库加载,则不是很有用查看时)
  • 高效的网络使用(避免每次都重复调用来完全重新填充表)
  • 跨应用背景持续/无限期存储新数据,直到有足够的互联网上传
  • 文件夹与该文件夹中的文件之间存在显着的一对多关系...我需要能够轻松访问文件夹中的所有文件
  • (更容易编码/维护...不是必需的,但会很好)

我对Core Data的理性:

优点:

  • 默认支持大部分我想做的事情
  • 以易于查询的方式轻松保存我的模型对象的所有其他方面,而不是大型媒体文件(例如文件夹名称等)
  • 有很多很棒的工具,例如 Magical RecordRestKit 可以与服务器交互/简化操作
  • 可以通过保存到文件系统一次存储更多数据
  • 易于坚持

缺点:

  • 这不是典型的 Core Data 设置,因为我并不特别关心永久存储,我只是希望尽可能多的文件夹可以立即可用;根据需要清除内存。
  • SPEED:小幅编辑仍需要重新保存整个上下文。这意味着加载、同步和刷新比缓存要慢(请参阅this 了解实际速度指标……这绝对不是不重要的)。大量持续写入磁盘似乎在性能方面可能存在问题。

缓存的合理性:

优点:

  • QUICKER:更符合半永久性方面(保存数据的快速旋转等)
  • 更轻松的内存管理(不必持续手动清除已保存到 Core Data 中我不再需要/不想要的旧数据)
  • 更少的样板/代码数量

缺点:

  • 默认不保留,在后台清除
  • 使用较少的内存;真的很担心必须不断删除数据并将数据重新加载到内存中的性能问题。
  • 没有查询支持并且(我不认为)没有办法选择性地清除对象的某些属性同时保留其他属性(我认为您必须解码整个对象,手动清除一些信息,然后重新编码?)
  • 默认情况下清除应用背景(即在转储信息以释放可能需要的内存时控制较少)

TLDR

我应该使用缓存还是 Core Data 来保存将从服务器半频繁更新的大文件?我要考虑的因素是效率(最小化服务器请求;存储数据直到被新数据覆盖)、速度(写入/加载)、数量数据存储/可用内存(内存问题涉及使用缓存移动大量数据,它会影响性能。在我开始看到不良性能之前,我可以同时在内存中拥有多少个文件?),可定制性(在我看来,我需要介于两者之间的东西,所以更容易适应我的用途)

而且重要的是....还有什么我完全错过的吗?像某种文件系统管理器或独特的缓存 ma-jiggy?)

【问题讨论】:

    标签: ios objective-c caching core-data video


    【解决方案1】:

    如果您所做的只是缓存文件,那么就不需要 CoreData,因为文件系统本身就是一个非常快速的文件键/值存储。

    如果你想拥有一堆文件的关联数据,你可以在文件上设置扩展属性(尽管你不能在搜索中有效地使用这些属性)。

    如果您仍想使用 CoreData,您当然可以这样做。你有几个选择。最常见的两个选项是:

    1. 将文件的 URL 作为属性存储在 CoreData 实体中,并自行管理将文件直接存储到磁盘。

    2. 将数据存储为 CoreData 属性,并为该属性选择“允许外部存储”选项。这将导致 CoreData 进行自己的计算,如果数据“足够小”,它将存储在数据库中。如果它“太大”,那么它将被存储为外部文件。

    Apple 没有记录截止值,但实验表明它是 1MB。

    使用选项 2 会更容易,因为 Core Data 会为您管理这一切。这是一个非常可行的选择,我在一个非常大的应用程序中使用了它,该应用程序存储了一堆非常大的文件(没有一个小到足以被选择保存在数据库中)。

    迁移速度存在问题,因为 Core Data 想要迁移整个存储。因此,您需要在决定之前考虑到这一点。

    您可能想构建一个测试应用程序,添加一堆东西,并在决定之前经历各种场景,但这是您最常用的两个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2012-12-20
      • 2023-03-07
      相关资源
      最近更新 更多