无法从...中删除关键路径“...”的观察者...,因为它未注册为观察者
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 绑定和控制器上不是线程安全的——如果您使用这些技术,多线程可能会很复杂。” -- 我会完整阅读您的链接并尝试找到解决方案。以上是关于无法从...中删除关键路径“...”的观察者...,因为它未注册为观察者的主要内容,如果未能解决你的问题,请参考以下文章