【问题标题】:Need to archive CLLocation data需要归档 CLLocation 数据
【发布时间】:2011-07-12 17:03:44
【问题描述】:

我有一组CLLocation 数据,我想存档。应该使用NSUserDefaults 系统吗?否则,如何最好地归档CLLocation 数据?

【问题讨论】:

标签: iphone nsuserdefaults nskeyedarchiver cllocation


【解决方案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,同时编码并在解码时重新创建它谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2012-06-06
    • 2012-09-11
    相关资源
    最近更新 更多