我正在尝试保存一个位置,然后使用 Core Location、MapKit 和 Core Data 框架在地图上检索该位置。
我所做的只是创建了名为 POI 的实体,并添加了一些属性,例如纬度(双精度型)、经度(双精度型)以及其他一些属性。
简单地说,我的应用程序使用两个 NSNumber 保存 POI。(经纬度)但我觉得必须有比这更聪明的方式来存储 CLLocation。
干杯。
我正在尝试保存一个位置,然后使用 Core Location、MapKit 和 Core Data 框架在地图上检索该位置。
我所做的只是创建了名为 POI 的实体,并添加了一些属性,例如纬度(双精度型)、经度(双精度型)以及其他一些属性。
简单地说,我的应用程序使用两个 NSNumber 保存 POI。(经纬度)但我觉得必须有比这更聪明的方式来存储 CLLocation。
干杯。
你在做什么很好。您应该在核心数据中将纬度和经度保存为双精度值。当您需要再次获取信息时,从 Core Data 中获取双精度数据并构造一个CLLocationCoordinate2D
具有类似CLLocationCoordinate2DMake
. 没有内置的存储位置的方法,因此存储纬度和经度分量就可以了。
如果您没有对纬度或经度进行任何数学运算(查找边界框等),您可以将它们存储为字符串。浮点数和双精度数可以稍微改变它们的值,使比较操作失败。
CLLocation 实现了 NSCoding 协议,因此您可以将它们作为可转换属性存储在 Core Data 中。您可以使用默认的 NSKeyedUnarchiveFromData 值转换器。
您只需将 CCLocation 对象传递给托管对象属性,它就会将其序列化为数据并将其作为 blob 存储在 SQL 存储中。当您需要返回位置对象时,它会自动反转该过程并返回给您一个完全填充的 CCLocation 对象。
这可能是得到你想要的最简单的方法。
存储它的“最佳”方式取决于你想用它做什么:
如果您手动操作,您可以保存/恢复许多附加属性(高度、水平精度、垂直精度、时间戳)。还有一些你做不到的(速度、航向);CLLocation 不提供合适的初始化方法并且属性是只读的。
如果您正在录制曲目,所有额外的属性都很有用。如果您在山区记录 POI(“我们仍然必须爬 100 m”),海拔高度很有用。水平/垂直精度可以用来表示 POI 有多大(例如,一个城市可能有几公里的“水平精度”并显示为一个大圆圈)。
您只需将 Core Data 属性类型设置为Transformable
. 如果将Value Transformer Name留空,则默认的转换NSKeyedArchiver
器适用于大多数 Foundation 类型,例如 NSURL 和 CLLocation。
您不需要使用 NSNumber 来存储纬度和经度点。您可以改为将 CLLocation 直接存储到核心数据。
为每个 CLLocation 设置一个实体,无论实体使用位置点,这都会是一个太多的关系。我们称之为 LocationPoint:
class LocationPoint: NSManagedObject {
@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var location: AnyObject
}
然后在 Xcode 数据模型中将location属性设置为可转换的。就是这样!
在 Objective-c 中,您实际上仍然可以将此 LocationPoint 属性声明为 CLLocation 而不会出现任何错误:
@property (nonatomic, strong) CLLocation *location