1

我有一个MKOverlay我想保存的大文件,Core Data这样我以后就不必再创建它了。由于这不是您可以选择的类型之一Core Data,我该如何保存它?

我需要先以某种方式对其进行编码吗?

那我使用的时候需要解码吗?

core data创建新属性时我应该选择什么样的对象?

多谢你们。

4

4 回答 4

1

我相信您可以使用 Apple 的NSCoding库将对象转换为序列化状态和从序列化状态转换。但是,Core Data 可能支持保存对象,但NSCoding允许您将任何实现它的类保存在任何地方,包括发送到服务器的字符串、写入磁盘的文件,或者如果您像我一样糟糕的程序员,可以保存NSUserDefaults条目。

编辑-您可能必须通过添加读写方法来实现NSCoding自己的类,我不确定。MKOverlay

于 2011-11-08T16:22:35.057 回答
1

如果您不需要查询不同的叠加层并且您没有在项目的其他地方使用核心数据,那么您最好将叠加层作为编码的 NSArray 缓存在磁盘上。

但是,如果您已经在使用 Core Data 或者您正在缓存多个覆盖,那么您可以在 NSData 类型的字段中对覆盖进行编码/解码。向实体添加其他字段,以便您可以查询您正在寻找的特定叠加层。

在 iOS 5 中,您可以通过选择“允许外部存储”选项来启用外部文件中 NSData 字段的可选存储。Core Data 将应用基于大小的启发式方法来确定 blob 或外部文件是否会带来更好的性能。

MKOverlay 符合 NSCoding,因此您可以使用 NSKeyedArchiver 的编码方法对整个 MKOverlay 对象数组进行编码和解码,并将结果存储在实体中的二进制字段中。您可能需要 + (NSData *)archivedDataWithRootObject:(id)rootObject on NSKeyedArchiver 和 + (id)unarchiveObjectWithData:(NSData *)data on NSKeyedUnarchiver

有关创建键控存档的详细信息,请参阅存档和序列化编程指南中的存档部分:http: //developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Archiving/Articles/archives.html

您可以为实体的二进制字段编写自定义访问器,为您编码和解码覆盖数组。另一种选择是创建一个封装编码和解码操作的值转换器。最终结果将是一个覆盖数组属性,您可以通过 entity.overlays 设置和读取该属性。

于 2011-11-09T04:01:44.103 回答
0

您需要获取构成覆盖的大型数据集,并将这些单独的数据节点转换为 NSManagedObjects 以存储在 CoreData 中。

我的意思是,您可能只需 NSCoder 将整个内容放入一个巨大的数据块中,但此时,您不妨将内容写入一个平面文件(坦率地说,如果您只想读/写它,这可能会更好不改变它)。

除非您要对数据集进行合法查询或零碎更改,否则不要使用 Core Data。

于 2011-11-08T21:19:31.830 回答
0

为什么不保存属性(大小、颜色、坐标等都可以用 NSNumbers 描述,并且可以本地存储在 Core Data 中)并在需要时重新创建 MKOverlay。老实说,我认为这是一种更有效的方法。我不确定创建对象的影响有多大,所以如果我错了,请证明我错了。

于 2011-11-08T20:55:01.627 回答