我有一个要存档的CLLocation数据数组。是否应该使用NSUserDefaults系统?否则,如何最好地归档CLLocation数据呢?
发布于 2011-03-10 21:24:43
UserDefaults只能存储某些类型的数据,并且应该用于存储用户首选项信息,而不是任意的应用程序状态数据。
引用Apple docs
NSUserDefaults类提供了与默认系统交互的编程接口。默认系统允许应用程序自定义其行为以匹配用户的首选项。例如,您可以允许用户确定应用程序显示的度量单位或自动保存文档的频率。
更多信息here。
如果您的CLLocation数据真的算作用户偏好信息(我不相信),那么您必须将CLLocation中的信息映射到与NSUserDefaults兼容的类型。阅读docs for NSUserDefaults。
如果您的CLLocation数据不是用户首选项信息,而只是需要保留的应用程序数据/状态,那么您有几个选择;您可以将其存储在核心数据中,也可以使用键控归档-例如,请参见this tutorial。
发布于 2015-01-09 04:04:29
要正确存储CLLocation而不丢失信息,请使用如下所示的NSKeyedArchiver:
CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];然后可以将其归档到NSUserDefaults,并且在使用NSKeyedUnarchiver检索它时也可以同样简单地进行解码:
CLLocation *myStoredLocation = (CLLocation *)[NSKeyedUnarchiver unarchiveObjectWithData:locationData];这些Swift equivalent functions是:
class func archivedDataWithRootObject(_ rootObject: AnyObject) -> NSData]
class func unarchiveObjectWithData(_ data: NSData) -> AnyObject?发布于 2011-05-10 20:37:07
使用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"];
}https://stackoverflow.com/questions/5259964
复制相似问题