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

Posted

技术标签:

【中文标题】无法从...中删除关键路径“...”的观察者...,因为它未注册为观察者【英文标题】:Cannot remove an observer ... for the key path "..." from ... because it is not registered as an observer 【发布时间】:2011-08-12 23:35:07 【问题描述】:

我有一个包含两个实体的核心数据模型:A 和 B。 A 与一个或多个 B 有关系。 B 有一个属性 bValue。

我创建了一个类的许多实例,其中一些实例调用了一个通知。该通知调用了一个方法,该方法创建一个新的 B 实体并将其添加到 A。使用 NSThread 创建实例是为了使 UI 更具响应性。

只有在没有调用太多通知的情况下才能正常工作。或者至少“同时”不会太多。

然后我得到这个异常:

Cannot remove an observer <NSArrayController 0x10016c150> for the key path "bValue" from <bValue 0x104e55c30> because it is not registered as an observer.

是的,B 绑定到一个 NSArrayController。

如果我从 NIB 文件中删除此 ArrayController,一切正常 很好(除了 ArrayController 必须做的所有事情) 如果我创建了许多 B 并将它们添加到 A 其他地方(通知方法之外) 一切都可以找到,也可以使用 ArrayController。

有人可以帮帮我吗?

(请原谅我发音不好。)

【问题讨论】:

【参考方案1】:

你说你在一个单独的线程上做这项工作。如果是这样,您需要确保您使用的是单独的NSManagedObjectContext。您不能在多个线程上使用相同的NSManagedObjectContext,也不能在另一个 MOC 中使用与一个 MOC 关联的 NSManagedObject。每个线程都需要独立与 CoreData 交互。

【讨论】:

但我从未在这些线程中碰过我的 NSManagedObjectContext。这也意味着它根本不起作用,但在上述某些情况下它会起作用。 线程问题是竞争条件。它们通常采用您所描述的形式。您是否在一个线程上获取NSManagedObject 并在另一个线程上处理它?你不能那样做。 developer.apple.com/library/ios/#documentation/cocoa/conceptual/… 好的,我明白了。我刚刚读到:“在大多数情况下,AppKit 和 UIKit 不是线程安全的;特别是在 Mac OS X Cocoa 绑定和控制器上不是线程安全的——如果您使用这些技术,多线程可能会很复杂。” -- 我会完整阅读您的链接并尝试找到解决方案。

以上是关于无法从...中删除关键路径“...”的观察者...,因为它未注册为观察者的主要内容,如果未能解决你的问题,请参考以下文章

NSRangeException - 无法移除观察者

我如何判断一个对象是不是附加了键值观察器

文件路径监控项目中观察者模式的分析

无法从特定 blob 容器中删除文件

从返回导航的单元格中删除观察者

Pyinotify -- 目录重命名后从原始路径引发的事件