Ответ 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];
}