删除观察者

时间:2009-10-14 06:19:00

标签: objective-c cocoa

在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:不是类方法。

3 个答案:

答案 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消息?