CLLocation 变量不发送 KVO - NSKeyValueObservingOptionNew

Posted

技术标签:

【中文标题】CLLocation 变量不发送 KVO - NSKeyValueObservingOptionNew【英文标题】:CLLocation Variable not sending KVO - NSKeyValueObservingOptionNew 【发布时间】:2014-03-22 13:27:22 【问题描述】:

我正在开发一个在位置模型中收集用户当前数据的简单应用程序。这是有效的,我可以记录位置。但是,没有 viewControllers 看到更新的变量。我在 viewControllers 中使用 KVO 来触发,但似乎 CLLocation 没有使用“NSKeyValueObservingOptionNew”发送。如果我使用“NSKeyValueObservingOptionInitial”,它将触发,但在 CLLocationManager 有机会设置实例之前触发。

有谁知道为什么 CLLocation 不发送“...New”值?就像我说的,它只有在设置为“...初始”状态时才有效。

想法?

查看控制器代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

    if ([keyPath isEqual:@"locationUpdated"]) 

        CLLocation *locationVariable = [[CLLocation alloc]init];
        locationVariable = self.location.currentLocation;
        NSLog(@"the location vaiable: %@", locationVariable);
        self.theMap.centerCoordinate = self.location.currentLocation.coordinate;

    

位置型号代码:

- (void)startLocationManger 

    if ([self locationManager] == nil) self.locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [_locationManager startUpdatingLocation];


- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

    CLLocation *locationFix = [locations lastObject];
    _currentLocation = locationFix;
    NSLog(@"Current Location: %@", _currentLocation);


【问题讨论】:

【参考方案1】:

位置模型代码未触发 KVO 通知的主要原因可能是 locationManager:didUpdateLocations 委托方法中的这一行:

_currentLocation = locationFix;

代码直接为您要观察的属性的支持变量赋值。

仅当您使用综合属性设置器时才会触发自动 KVO 通知:

self.currentLocation = locationFix;  // <-- assign using self.xxx

有点不相关,但在observeValueForKeyPath 方法中:

    我不确定你为什么要查看if ([keyPath isEqual:@"locationUpdated"])。确定是您要查找的 keyPath 吗?

    在这段代码中:

    CLLocation *locationVariable = [[CLLocation alloc]init];
    locationVariable = self.location.currentLocation;
    

    alloc+init 是不必要的,因为该变量会立即被赋予一个新值。做吧:

    CLLocation *locationVariable = self.location.currentLocation;
    

【讨论】:

感谢您的注意...我根据您的建议进行了更改,但仍然没有。 keyPath 是通过链接调用设置的 '[self.location addObserver:self forKeyPath:@"locationUpdated" options:NSKeyValueObservingOptionNew context:NULL];'我清理了代码(谢谢)。还有其他想法吗? 在视图控制器中,尝试像这样执行 addObserver:[self addObserver:self forKeyPath:@"self.location.currentLocation" options:NSKeyValueObservingOptionNew context:NULL]; 并暂时删除在 observeValueForKeyPath 中对 keyPath 值的检查。 You Rock :-) 谢谢!

以上是关于CLLocation 变量不发送 KVO - NSKeyValueObservingOptionNew的主要内容,如果未能解决你的问题,请参考以下文章

如何调试对象发送 KVO 通知的原因?

CLLocation Manager如何在一定距离后更新

iOS开发笔试面试- KVC/KVO简单使用

如何使用 iPhone 的 CLLocation 类将纬度和经度分配给变量?

实例变量不保留值

如何从 CLLocation 变量中提取经度和纬度?