需要归档 CLLocation 数据
Posted
技术标签:
【中文标题】需要归档 CLLocation 数据【英文标题】:Need to archive CLLocation data 【发布时间】:2011-07-12 17:03:44 【问题描述】:我有一组CLLocation
数据,我想存档。应该使用NSUserDefaults
系统吗?否则,如何最好地归档CLLocation
数据?
【问题讨论】:
如果使用 Core Data,请参阅此帖子寻求帮助:***.com/questions/3797128/… 【参考方案1】:这是通常的方法。
CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];
【讨论】:
【参考方案2】:要正确存储 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?
【讨论】:
非常感谢!我收到与尝试向已发布的对象发送消息相关的“EXC_BAD_ACCESS code=1”错误。就我而言,我使用 dataWithBytes:length: 和 getBytes:length: 来存储/获取 CLLocation 对象。我怀疑 buffer:&locationObject 正在释放它,它为方法提供了缓冲区的内存地址,但是当数据字节被复制到缓冲区时,内存位置指针变成了非核心基础指针。【参考方案3】:使用 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"];
【讨论】:
警告:解码时此代码 sn-p 会将 lat 和 long 放入float
locals,这会浪费很多精度。 (它们被正确编码和解码,但这会导致解码后的位置数据不正确。)【参考方案4】:
UserDefaults 只能存储某些类型的数据,应该用来存储用户偏好信息,而不是任意的应用程序状态数据。
引用Apple docs:
NSUserDefaults 类提供了一个 用于交互的编程接口 使用默认系统。默认值 系统允许应用程序 自定义其行为以匹配 用户的偏好。例如,你 可以让用户确定什么 测量单位 您的应用 显示或文档的频率 自动保存。
更多信息here。
如果您的 CLLocation 数据确实算作用户偏好信息(我不相信),您必须将 CLLocation 中的信息映射到与 NSUserDefaults 兼容的类型。阅读docs for NSUserDefaults。
如果您的 CLLocation 数据不是用户偏好信息,而只是您需要保留的应用程序数据/状态,那么您有几个选择;您可以将其存储在核心数据中,或者您可以使用密钥归档 - 例如,请参阅 this tutorial。
【讨论】:
thks ,但是 cllocation 值由 2 个 lat long 的 double 值组成,我如何对其进行编码,. 那么您打算将其编码到哪里?请接受人们给你的众多答案中的一些,我稍后会回信。 thks 找到了使用 nsarchiver 的解决方案,正如你所说的那样,它的工作原理就像魅力一样谢谢,我还将 cllocation2d 值划分为 lat 和 long,同时编码并在解码时重新创建它谢谢以上是关于需要归档 CLLocation 数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 iPhone 的 CLLocation 类将纬度和经度分配给变量?
CLLocation + Weather(Alamofire) 问题