在NSManagedObject子类中,我有代码......
- (void) awakeFromInsert {
[self addObserver:[NSApp delegate] forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
}
将我的App Delegate添加为Observer,我现在想要做的是从我的App Delegate中,我想将自己删除为我的NSManagedObject Sub Class的Observer。
我该怎么做? 感谢。
我想把它添加到我的App Delegate
[JGManagedObject removeObserver:self forKeyPath:@"name"];
但遗憾的是removeObserver:forKeyPath:
不是类方法。
答案 0 :(得分:4)
对于这样的事情,最好重新考虑设计。在这种情况下,委托必须具有托管对象本身的一些特定知识才能执行此操作 - 并且委托人必须知道在生命周期中它应该(或者想要)何时停止观察对象。
你有几个选择。您可以让委托在创建它时开始观察它,然后在放弃所有权时停止观察它,而不是在插入时从唤醒状态执行此操作。如果在您的设计中不可行,则可以在取消分配对象时删除其观察者。如果这是一次即发即弃(基本上委托只关心一次),您可以在第一次更改通知后删除观察者。但是,由于您在此对象的创建生命周期内创建了观察,因此最好在销毁对象时删除该观察结果:
- (void)dealloc
{
[self removeObserver:[NSApp delegate] forKeyPath:@"name"];
// other clean-up
[super dealloc];
}
当对象从提取和故障中唤醒时,您可能还希望这样做,并在对象成为故障时释放观察者。
答案 1 :(得分:1)
与第一次添加观察者的方式大致相同,只有较少的选项:
// Given some managed object "object"...
[object removeObserver:self forKeyPath:@"name"];
请注意,我们删除self
作为观察者,而不是[NSApp delegate]
给出的应用程序委托,因为代码将在委托本身内运行。
答案 2 :(得分:0)
在您从removeObserver:forKeyPath
删除对象之前,如何向对象发送ManagedObjectContext
消息?