我有一个很大的MKOverlay
我希望保存在Core Data
中,以便我以后不必创建它。由于这不是您在Core Data
中可以选择的类型之一,我该如何保存?
我需要先以某种方式对其进行编码吗?
我在使用时是否需要解码?
在创建新属性时,我在core data
中选择了哪种对象?
谢谢你们。
答案 0 :(得分:1)
我相信您可以使用Apple的NSCoding
库将对象转换为序列化状态。但是,Core Data可能支持保存对象,但NSCoding
允许您保存任何在任何地方实现它的类,包括发送到服务器的字符串,写入磁盘的文件,或者如果你'和我一样糟糕的程序员,一个NSUserDefaults
条目。
编辑 - 您可能必须通过添加读写方法,基于NSCoding
将MKOverlay
实现到您自己的类中,我不确定。
答案 1 :(得分:1)
如果您不需要查询不同的叠加层并且您没有在项目的其他位置使用核心数据,那么最好将磁盘上的叠加层缓存为编码的NSArray。
但是,如果您已经在使用Core Data或者您正在缓存多个叠加层,那么您可以在NSData类型的字段中对叠加层进行编码/解码。向实体添加其他字段,以便查询您要查找的特定叠加层。
在iOS 5中,您可以通过选择“允许外部存储”选项在外部文件中启用NSData字段的可选存储。核心数据将应用基于大小的启发式方法来确定blob或外部文件是否会带来更好的性能。
MKOverlay符合NSCoding,因此您可以使用NSKeyedArchiver的编码方法对整个MKOverlay对象进行编码和解码,并将结果存储在实体的二进制字段中。你可能想要NSKeyedArchiver上的+(NSData *)archivedDataWithRootObject:(id)rootObject和NSKeyedUnarchiver上的+(id)unarchiveObjectWithData:(NSData *)数据
创建密钥存档的详细信息,请参阅“存档和序列化编程指南”中的“存档”部分。您可以为实体的二进制字段编写自定义访问器,为您编码和解码覆盖数组。另一种选择是创建一个封装编码和解码操作的值转换器。最终结果将是一个覆盖数组属性,您可以通过entity.overlays设置和读取。
答案 2 :(得分:0)
为什么不保存属性(大小,颜色,坐标等都可以用NSNumbers描述,并且那些可以本地存储在Core Data中)并在需要时重新创建MKOverlay。我认为这是一个更诚实的方法。我不确定创建一个对象有多大的影响,所以如果我错了就证明我错了。
答案 3 :(得分:0)
您需要获取组成叠加层的大型数据集,并将这些单独的数据节点转换为NSManagedObjects以存储在CoreData中。
我的意思是,你可能只是把NSCoder整个东西都变成了一个巨大的数据包,但是那时候,你也可以把这个东西写成一个平面文件(如果你想做的就是读取,这可能会更好/写它而不改变它。)
除非您要对数据集进行合法查询或零碎更改,否则请勿使用核心数据。