2012-06-30 60 views
0

我观察与国际志愿者组织核心数据的值,但是当我删除观察者,我得到的消息:removeObserver失败,核心数据

无法从,因为它删除观察员关键路径“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]; 

在这里你可以看到 observationInfo和removeObserver之前的一些细节的内容叫做:

(LLDB)PO OI(ID)$ 1 = 0x06b42d80( 语境:为0x0,房产:0x6b425e0>)

(LLDB)PO自(MenuViewController * const的)$ 2 = 0x08136f90

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

+0

这可能是一个索引问题 - 只是为了调试它,在每个注册中的观察者列表中添加一个额外的值,并确保您获取的是您添加观察者的同一个值。 – Stavash

+0

您还可以在删除观察者之前记录_selectedFlight和自己的地址。只是为了确保你正在移除正确的观察者。 – diederikh

+0

0x08136f90地址没有改变。有趣的是,如果我修改了代码,并且removeObserver在我添加后立即调用,那么没问题,如果我正在导航GUI并稍后调用它,那么会发生此类崩溃。 –

回答

0

我路过这个问题遗留代码,我做了如下:

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

因为我的代码是旧的,我不知道是什么原因造成这个问题,但我发现检查observerInfo属性修复了它。

希望有所帮助。