0

我有一个数据库对象和一些照片对象。

数据库对象包含一个整数属性和一个可变字典属性。

当我创建一个新的照片对象并且可变字典包含指向照片对象的指针时,整数会跟踪下一个用作可变字典键的空闲数字。

照片对象包含图像、图像描述和图像拍摄日期。

当我的 applicationDidBecomeActive 和 applicationWillResignActive 方法触发时,我一直在使用 NSKeyedUnarchiver 和 NSKeyedArchiver 来读写这些对象。

而且,这一切都运作良好。当 applicationWillResignActive 触发时,它调用 NSKeyedArchiver 并将其指向作为根的数据库对象。然后编码器写出整数,然后当它遇到可变字典时,它会下降到其中并调用每个照片对象以保存其属性,即图像、描述和日期。

正如我所说,一切都运行良好。但是,随着照片数量的增加,它似乎越来越慢,所以我做了一些计时。

我发现读入档案比写出档案快大约 25 倍。

所以,我想到了只写出新的或改变的照片作为加快写入速度的方法。毕竟,大部分照片都是过去的照片,我可能有 30 或 50 张以前的照片,而这次我可能只拍两三张新照片。

我创建了一些标志来指示照片是新的还是旧的。当 applicationWillResignActive 触发并且我发现自己处于处理每个 encodeWithCoder 调用的照片对象中时,如果照片是新的,我会保存图像、描述和日期,如果是旧的,我会跳过保存。

好吧,我没有得到我希望的结果:-)

当 applicationWillResignActive 触发时,我跳过写出的所有照片最终都会被写为空的照片对象,它会用相同的键覆盖以前的照片对象。然后,当我重新加载它们时,我有 bupkis、nada、zip。

第一个问题,我想,我是否可以只写出我的对象树的一部分,而我没有写出的部分仍然完好无损地保留在前面的完整写中?我开始怀疑这是否是一个幼稚的想法。

加里蒙

4

2 回答 2

0

为什么不只在 init 方法上保存图像?如果您创建对象,您可能想要保存它。因此将标志 hasChanges == off 放在 init 方法中,然后检查该标志以进行保存...

于 2013-08-17T14:40:47.500 回答
0

随着存档的增长,使用某些对象数组的存档将变得越来越低效。您的对象包含图像这一事实加剧了这种情况。两个想法:

  1. 您应该考虑使用Core Data来存储这些数据。(您也可以直接使用 SQLite,但 Core Data 是 iOS 中首选的对象持久化技术。)这样,当您想要保存一个新对象时,您只需添加该新对象,而不是归档整个集合每次的对象。

  2. 此外,如果速度是最重要的并且如果您的图像很大,则 SQLite(Core Data 默认使用的数据库)在处理大型 BLOB(即图像之类的东西)时效率低下。因此,尽管听起来很不优雅,但您可能希望将图像保存到您的Documents文件夹中,并且只在 CoreData 中存储图像文件的 URL 或路径。

于 2013-08-17T16:21:00.127 回答