Нужно архивировать данные CLLocation - PullRequest
6 голосов
/ 10 марта 2011

У меня есть массив CLLocation данных, которые я хотел бы заархивировать. Следует ли использовать систему NSUserDefaults? В противном случае, как лучше всего заархивировать данные CLLocation?

Ответы [ 4 ]

14 голосов
/ 08 января 2015

Чтобы правильно сохранить 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?
4 голосов
/ 10 марта 2011

UserDefaults может хранить только определенные типы данных и должен использоваться для хранения информации о пользовательских предпочтениях, а не произвольных данных о состоянии приложения.

Цитировать Apple Docs :

Класс NSUserDefaults предоставляет программный интерфейс для взаимодействия с системой по умолчанию. Значения по умолчанию система позволяет приложению настроить его поведение в соответствии с предпочтения пользователя. Например, вы может позволить пользователям определять, что Единицы измерения вашего приложения отображает или как часто документы автоматически сохраняется.

Подробнее здесь .

Если ваши данные CLLocation действительно учитываются как информация о пользовательских предпочтениях (в чем я не уверен), вам придется сопоставить информацию внутри CLLocation с типами, совместимыми с NSUserDefaults. Прочитайте документы для NSUserDefaults .

Если ваши данные CLLocation - это не информация о пользовательских предпочтениях, а просто данные / состояние приложения, которые необходимо сохранить, у вас есть несколько вариантов; Вы можете сохранить их в основных данных или использовать архивирование на основе ключей - см., например, это руководство .

1 голос
/ 21 апреля 2017

Это обычный метод.

CLLocation *myLocationToStore = ...; // (a CLLocation object)
NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:myLocationToStore];
1 голос
/ 10 мая 2011

Обнаружил решение, используя 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"]; 

}
...