Необходимо архивировать данные CLLocation
У меня есть массив CLLocation
Данные, которые я хотел бы заархивировать. Если NSUserDefaults
Система будет использоваться? В противном случае, как лучше всего архивировать CLLocation
данные?
4 ответа
UserDefaults может хранить только определенные типы данных и должен использоваться для хранения информации о пользовательских предпочтениях, а не произвольных данных о состоянии приложения.
Цитировать документы Apple:
Класс NSUserDefaults предоставляет программный интерфейс для взаимодействия с системой по умолчанию. Система по умолчанию позволяет приложению настраивать свое поведение в соответствии с предпочтениями пользователя. Например, вы можете разрешить пользователям определять, какие единицы измерения отображаются в вашем приложении или как часто документы сохраняются автоматически.
Больше информации здесь.
Если ваши данные CLLocation действительно считаются информацией о пользовательских предпочтениях (в чем я не уверен), вам придется сопоставить информацию внутри CLLocation с типами, совместимыми с NSUserDefaults. Прочитайте документы для NSUserDefaults.
Если ваши данные CLLocation - это не информация о предпочтениях пользователя, а просто данные / состояние приложения, которые необходимо сохранить, у вас есть несколько вариантов; Вы можете хранить их в основных данных или использовать архивирование по ключам - см., например, это руководство.
Чтобы правильно хранить 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?
Выяснили решение, используя 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"];
}
Это обычный метод.
CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];