【问题标题】:Store Large Array with strings and images in Swift在 Swift 中存储带有字符串和图像的大型数组
【发布时间】:2015-07-25 20:13:15
【问题描述】:

您好,我正在尝试存储一个填充了对象的数组,以便在应用程序完全关闭时它不会消失。

问题: 如果我使用核心数据并将数组转换为 NSData 则它可以工作。但是应用程序在处理数组时会冻结。 我也尝试过可转换的数据类型,但我无法让它工作。 而且我也不能使用 NSUserdefaults 因为它不支持图片。

有谁知道我如何解决这个问题。 我是编程的新手,所以这可能是一种完全错误的方法。

【问题讨论】:

  • 您需要如何访问它们?一次全部,按照它们在数组中的顺序顺序排列,还是按照没有预定义的顺序单独排列?
  • 顺序对于它的工作至关重要,因为我做了一些丑陋的编码来用数组填充表格视图。 let Title = ArrayTable[(indexPath.row*3)] as! String let Plot = ArrayTable[(indexPath.row*3)+1] as! String let Poster = ArrayTable[(indexPath.row*3)+2] as! UIImage

标签: arrays swift core-data nsuserdefaults storing-data


【解决方案1】:

首先将图像保存在 Documents 目录中的图像目录中具有唯一文件名的单个文件中。将唯一的文件名放入数组中,而不是图像。

然后根据您的需要,如果需要快速随机访问,可以将每个图像信息保存在 Core Data 中。或者将数组保存在文件中。

对于 1500 个约 100 个字符的字符串,每个字符串保存在一个文件中可能没问题,我会从那里开始,如果出现性能问题,Core Data 会解决它。

正如肯贝克所说:“做最简单的事情可能会奏效。”我不相信如果数组中有 750 个图像,如果它们的大小很大。

不要使用NSUserDefaults

【讨论】:

  • 对于 1500 个字符串和 750 个图像 名称,最快的方法是将数组加载到内存中。最初加载数组需要一点时间(可能很少。)一旦加载到内存中,简单的数组索引将比散列查找、触发错误以及从磁盘加载每个数组索引的数据快得多。
  • 我会试试的!但不要误会我的意思。图像存储在数组本身中,因为图像非常小。总数组大小可能是 10mb
  • 您需要将每个图像(它们是UIImage 实例)转换为NSData,因为UIImage 不符合NSCodingNSUserDefaults 是一个糟糕的选择,因为所有项目都保存在一个 plist 文件中,你的数组和任何其他使用 NSUserDefaults 的东西,它是为小东西设计的,啊:用户默认值!
  • 我同意 zaph(已投票)。把事情简单化。首先尝试一个简单的数组。不要尝试一次将 750 张图像加载到内存中。即使它们每个只有 20k,也就是大约 15 兆字节的内存。将图像名称放入数组中,并根据需要加载图像。
  • @DuncanC 感谢您的编辑!我在路上,成为一个糟糕的拼写者自动完成功能让我很生气。
【解决方案2】:

Core Data 对于简单地将数组保存到磁盘来说太过分了。

你要保存什么样的对象?

如果您已经有将数组转换为 NSData 的逻辑,为什么不将文件保存到您的文档目录或缓存目录(如果清除后可以重新创建,则缓存,如果它是唯一的并包含用户状态信息的文档。)

编辑:

zaph 在他的问题中提出了一些好的观点。这个数组有多大(元素数量和总数据大小)。将它全部加载到内存中是否合理?

如果您正在寻找一种随机访问方式来一次加载一个元素,那么数据库可能是合理的。

具体解决方案取决于您的问题的具体情况,因此我们需要更多信息。

【讨论】:

  • 我使用数组来填充表格视图,它包含字符串和图像。所以拆分数组有点不方便。
  • @AndresVlaeminck 有多少? 10、100、1000 甚至更多?另请参阅我的回答。
  • @zaph 1500 个字符串和 750 个图像。
  • 单个字符串大小? 10 个字符、100 个、1000 个还是更多?
  • @zaph 字符串的字符数约为 250
猜你喜欢
  • 2016-03-16
  • 2018-07-31
  • 2015-09-11
  • 2013-10-21
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2018-06-11
  • 2022-01-21
相关资源
最近更新 更多