Необходимо архивировать данные 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];
Другие вопросы по тегам