我想要归档的CLLocation
数据数组。应该使用NSUserDefaults
系统吗?否则,如何最好地归档CLLocation
数据?
答案 0 :(得分:14)
要在不丢失信息的情况下正确存储CLLocation,请使用NSKeyedArchiver,如下所示:
CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];
然后可以将其存档到NSUserDefaults,同样只需在使用NSKeyedUnarchiver检索它时进行解码:
CLLocation *myStoredLocation = (CLLocation *)[NSKeyedUnarchiver unarchiveObjectWithData:locationData];
class func archivedDataWithRootObject(_ rootObject: AnyObject) -> NSData]
class func unarchiveObjectWithData(_ data: NSData) -> AnyObject?
答案 1 :(得分:4)
UserDefaults只能存储某些类型的数据,应该用于存储用户首选项信息,而不是任意应用程序状态数据。
引用Apple docs:
NSUserDefaults类提供了一个 用于交互的程序化界面 使用默认系统。默认值 系统允许应用程序 自定义其行为以匹配a 用户的偏好。例如,你 可以让用户确定什么 计量单位您的申请 显示文件或文件的频率 自动保存。
更多信息here。
如果您的CLLocation数据确实计入用户首选项信息(我不相信),您必须将CLLocation内的信息映射到与NSUserDefaults兼容的类型。阅读docs for NSUserDefaults。
如果您的CLLocation数据不是用户首选项信息,而只是您需要保留的应用程序数据/状态,那么您有几个选项;您可以将其存储在核心数据中,或者您可以使用键控存档 - 例如,请参阅this tutorial。
答案 2 :(得分:1)
使用nsarchiver找到解决方案,因为你说它像魅力一样工作。这就是我所做的。
- (id)initWithCoder:(NSCoder *)aDecoder
{
self.PlaceName=[aDecoder decodeObjectForKey:@"inapPlaceName"];
float lat, long1;
lat=[aDecoder decodeDoubleForKey:@"inapCoordinateLat"];
long1=[aDecoder decodeDoubleForKey:@"inapCoordinateLong"];
//inapCoordinate=[[CLLocationCoordinate2D alloc] initWithLatitude:lat1 longitude:long1];
CLLocationCoordinate2D new_coordinate = { lat, long1 };
self.inapCoordinate=new_coordinate;
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:PlaceName forKey:@"inapPlaceName"];
[aCoder encodeDouble:inapCoordinate.latitude forKey:@"inapCoordinateLat"];
[aCoder encodeDouble:inapCoordinate.longitude forKey:@"inapCoordinateLong"];
}
答案 3 :(得分:1)
这是常用的方法。
CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];