需要归档 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 列表中的地点/城市名称

CLLocation + Weather(Alamofire) 问题

单纯修改oracle归档路径需要关闭数据库吗

使用Rman备份的归档日志恢复数据库时,需要先还原归档日志吗

CLLocation 如何将数据解析到我的应用程序标签中