Как сохранить CLLocation между запусками приложений? - PullRequest
2 голосов
/ 25 августа 2010

Я хочу сохранить 2 CLLocations между запусками приложения.Это единственные данные, которые я хочу сохранить в памяти между запусками.Как мне это сделать?Есть ли в CLLocation файл записи или он хранится в coredata или NSUserDefaults?Я хочу сохранить весь объект CLLocation, не хочу хранить только широту / долготу, а затем делать больше вычислений и т.д.

Ответы [ 2 ]

7 голосов
/ 25 августа 2010

Глядя на документацию, я вижу, что CLLocation реализует протокол NSCoding.

Это означает, что вы можете архивировать и разархивировать a CLLocationэкземпляр с использованием классов NSKeyedArchiver и NSKeyedUnarchiver.

Вы также можете поместить несколько экземпляров CLLocation в любой контейнерный (родительский) класс, который реализует NSCoder, например, NSDictionary или * 1017.* а затем заархивируйте или разархивируйте всю коллекцию объектов.

См. Руководство по программированию архивов и сериализаций для получения более подробной информации.Или оставьте вопрос с кодом, если вы застряли.

1 голос
/ 25 ноября 2012

Ответ St3fan - это то, что я стоил и отлично работает.Простое решение простой проблемы!Я думал, что поделюсь кодом, который придумал.

У меня есть класс Singleton, который содержит мой CLLocationManager, этот класс обрабатывает постоянство и перенаправляет методы CLLocationManagerDelegate в массив делегатов на случай, еслинесколько классов заинтересованы в этих сообщениях (и это всегда было в моих приложениях).

Этот код, вероятно, не будет работать как копирование / вставка, но если вы не можете понять, что вам нужноИсходя из этого, найдите шаблон синглтона и изучите его!_lastLocation - это ивар с свойством readonly для чтения другими классами.persistLastLocation выполняет работу по сохранению местоположения.Вам следует звонить, когда вы получаете новое местоположение.

////////////////////////////////////////////////////////////////////////////////////////////////////
- (id)init {
    self = [super init];
    if (self) {
        self.myLocationManager = [[CLLocationManager alloc] init];
        self.myLocationManager.delegate = self;

        // Some config
        self.myLocationManager.desiredAccuracy = 482; // .3 miles
        self.myLocationManager.distanceFilter = 200;


        NSLog(@"CLLocationManager authStatus on start up: %d", [CLLocationManager authorizationStatus]);
        NSLog(@"Location services enabled: %d", [CLLocationManager locationServicesEnabled]);

        CLLocation *decodedLocation = [NSKeyedUnarchiver unarchiveObjectWithFile:[self lastLocationPersistenceFilePath]];
        if (decodedLocation) {
            NSLog(@"Decoded location: %@", decodedLocation);
            _lastLocation = decodedLocation;
        }

    }

    return self;
}

#pragma mark -
#pragma mark MyLocationManager
////////////////////////////////////////////////////////////////////////////////////////////////////
- (NSString *)lastLocationPersistenceFilePath {
    NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"my_app_last_location"];
    return filePath;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)persistLastLocation {   
    BOOL success = [NSKeyedArchiver archiveRootObject:self.lastLocation
                                               toFile:[self lastLocationPersistenceFilePath]];
    if (!success) {
        NSLog(@"Could not persist location for some reason!");
    }
}

#pragma mark -
#pragma mark CLLocationManagerDelegate
////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    // Forward this message to the new iOS 6 delegate method.
    [self locationManager:manager didUpdateLocations:@[oldLocation]];
}

////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *latestLocation = [locations lastObject];

    _lastLocation = latestLocation;
    [self persistLastLocation];    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...