6

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

4

4 回答 4

15

要正确存储 CLLocation 而不会丢失信息,请使用 NSKeyedArchiver,如下所示:

CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];

然后可以将其归档到 NSUserDefaults,并同样在使用 NSKeyedUnarchiver 检索它时进行解码:

CLLocation *myStoredLocation = (CLLocation *)[NSKeyedUnarchiver unarchiveObjectWithData:locationData];

Swift 等价函数是:

class func archivedDataWithRootObject(_ rootObject: AnyObject) -> NSData]
class func unarchiveObjectWithData(_ data: NSData) -> AnyObject?
于 2015-01-08T20:04:29.240 回答
4

UserDefaults 只能存储某些类型的数据,并且应该用于存储用户偏好信息,而不是任意应用程序状态数据。

引用Apple 文档

NSUserDefaults 类提供了一个与默认系统交互的编程接口。默认系统允许应用程序自定义其行为以匹配用户的偏好。例如,您可以允许用户确定应用程序显示的度量单位或自动保存文档的频率。

更多信息在这里

如果您的 CLLocation 数据确实算作用户偏好信息(我不相信),您必须将 CLLocation 中的信息映射到与 NSUserDefaults 兼容的类型。阅读NSUserDefaults 的文档

如果您的 CLLocation 数据不是用户偏好信息,而只是您需要保留的应用程序数据/状态,那么您有几个选择;您可以将其存储在核心数据中,或者您可以使用密钥归档 - 例如,请参阅本教程

于 2011-03-10T13:24:42.837 回答
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"]; 

}
于 2011-05-10T12:37:06.920 回答
1

这是通常的方法。

CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];
于 2017-04-21T09:44:36.273 回答