NSKeyValueObserving не работает
Я написал CLLocationManager Singleton с именем LocationManager и хочу наблюдать за обновленным местоположением. Но наблюдательная часть не работает. Может кто-нибудь сказать мне, в чем проблема. Благодарю. Ниже приведены мои коды:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if(object == self){
if([keyPath isEqualToString:@"curStandardLocation"]){
NSLog(@"current location is changed ....");
}
}}(in LocationManager.m)
if([self.locationManager locationmanagerstatus]){
[self.locationManager startLocationTracking];
[[LocationManager sharedInstance] addObserver:self forKeyPath:@"curStandardLocation" options:NSKeyValueObservingOptionNew context:nil];} (in a separate viewcontroller where I need to listen to the location)
1 ответ
Если вы хотите отслеживать изменения местоположения, вы можете сделать это с
Создайте менеджера в нашем контроллере init
метод:
_locationManager = [[CLLocationManager alloc] init];
[_locationManager setDelegate:self];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager startUpdatingLocation];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
[locationManager requestWhenInUseAuthorization];
}
в viewWillAppear:
метод, начать мониторинг изменения местоположения значения.
if ([CLLocationManager locationServicesEnabled]) {
// Find the current location
[self.locationManager startMonitoringSignificantLocationChanges];
//rest of code...
}
Мониторинг значительных изменений хорош, потому что:
- Он имеет более низкое энергопотребление, чем более частые типы обновлений.
- "Значительные" изменения являются переменными, но намного меньше, чем несколько миль, использованных для запуска толчка.
- Делегат будет вызываться, даже если приложение находится в фоновом режиме, позволяя использовать для постоянного обновления местоположения пользователя, даже если приложение не используется.
Вот два важных обратных вызова для реализации, locationManager:didUpdateLocations:
а также locationManager:didFailWithError:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// locations contains an array of recent locations, but this app only cares about the most recent
// which is also "manager.location"
}
Также добавьте в свой info.plist
<key>NSLocationUsageDescription</key>
<string>The application require location services to work</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>The application require location services to work</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>The application require location services to work</string>