removeObserver因核心数据而失败

时间:2012-06-30 10:59:49

标签: ios core-data data-binding key-value-observing

我正在使用KVO观察核心数据值,但当我删除观察者时,我收到消息:

无法删除关键路径“flightname.value”的观察者,因为它未注册为观察者。

以下代码调用了两次。第一次_selectedFlight为null,因此不会触发removeObserver。我想第二次删除,第一次分配了什么。观察者地址没有变化。

//Remove old binding.
if (_selectedFlight) {
    id oi = [_selectedFlight observationInfo];
    if (![oi isFault]) {
        //NOTE: In somehow I cant remove it.
        [_selectedFlight removeObserver:self forKeyPath:@"flightname.value"];
    }
}

_selectedFlight = [_selectedRegistration.flights objectAtIndex:(_selectedRegistration.flights.count - indexPath.row - 1)];

//Bind flightname to the Summary View.
[_selectedFlight addObserver:self forKeyPath:@"flightname.value" options:0 context:NULL];
  

在这里你可以看到的内容   observeInfo和在调用removeObserver之前的一些细节。:

     

(lldb)po oi(id)$ 1 = 0x06b42d80(   上下文:0x0,属性:0x6b425e0> )

     

(lldb)po self(MenuViewController * const)$ 2 = 0x08136f90   

     

(lldb)po _selectedFlight(Flight *)$ 3 = 0x06b26770(实体:Flight; id:0x6b26ef0    ;数据:   {       date =“0x6b1b8f0”;       destination =“0x6b29140”;       flightname =“0x6b29150”;       id = 1;       ladc =零;       loadsheet = nil;       origin =“0x6b29160”;       registration =“0x6e60700”;       sta =“0xc81fb90”;       std =“0xc8203d0”;       todc =“0x6b293e0”; })

1 个答案:

答案 0 :(得分:0)

我在遗留代码中传递了这个问题,我执行了以下操作:

 if (object && object.observationInfo)
    [object removeObserver:self forKeyPath:@"key"];

因为我的代码是遗留的,我不知道是什么导致了这个问题,但我发现检查observationInfo属性修复了它。

希望有所帮助。