需要归档CLLocation数据

时间:2011-03-10 13:02:05

标签: iphone nsuserdefaults nskeyedarchiver cllocation

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

4 个答案:

答案 0 :(得分:14)

要在不丢失信息的情况下正确存储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?

答案 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];