我有一个数据库对象和一些照片对象。
数据库对象包含整数属性和可变字典属性。
当我创建一个新的照片对象并且可变字典包含指向照片对象的指针时,整数会跟踪下一个用作可变字典键的空闲数字。
照片对象包含图像,图像描述和拍摄图像的日期。
当我的applicationDidBecomeActive和applicationWillResignActive方法触发时,我一直在使用NSKeyedUnarchiver和NSKeyedArchiver来读取和写入这些对象。
并且,它一直运作良好。当applicationWillResignActive触发时,它会调用NSKeyedArchiver并将其作为根指向数据库对象。编码器然后写出整数,然后当它遇到可变字典时,它下降到它,并调用每个照片对象以保存其属性,即图像,描述和日期。
正如我所说,它一直运作良好。但是,随着照片数量的增加,它似乎越来越慢,所以我做了一些时间。
我发现阅读档案的速度大约是写出档案的25倍。
所以,我设想了只写出新的或改变的照片作为加速写入方法的方法。毕竟,大多数照片来自过去的会议,我可能有30或50个以前的照片,这次我可能只会拍摄两到三个新照片。
我创建了一些标志,表明照片是新的还是旧的。当applicationWillResignActive触发并且我发现自己在处理每个encodeWithCoder调用的照片对象中时,如果照片是新的,我保存图像,描述和日期,如果它是旧的,我会跳过保存。
好吧,我没有得到我希望得到的结果: - )
当applicationWillResignActive触发时,我跳过写出的所有照片最终都被写为空照片对象,用相同的键覆盖之前的照片对象。然后,当我把它们装回时,我有bupkis,nada,zip。
我想,第一个问题是,我是否只能写出我的对象树的一部分,并且我没有写出的部分仍然保留在早期的完整写入中?我开始怀疑这可能是一个天真的想法。
Gallymon
答案 0 :(得分:0)
为什么不仅在init方法上保存图像?如果您创建对象,则可能需要保存它。所以在init方法中放置标志hasChanges == off,然后检查该标志以保存...
答案 1 :(得分:0)
随着存档的增长,使用某些对象数组的存档将变得越来越低效。您的对象包含图像这一事实加剧了这种情况。两个想法:
您应该考虑使用Core Data来存储此数据。 (您也可以直接使用SQLite,但Core Data是iOS中首选的对象持久性技术。)这样,当您想要保存新对象时,您只需添加该新对象,而不是归档整个集合。每次都是对象。
此外,如果速度是主要关注点,并且如果图像很大,则SQLite(默认情况下Core Data使用的数据库)在处理大型BLOB(即图像之类的东西)时效率低下。因此,听起来不那么优雅,您可能希望将图像保存到Documents
文件夹,并且只在CoreData中存储图像文件URL或路径。