Невозможно удалить наблюдателя для ключевого пути из, потому что он не зарегистрирован как наблюдатель

У меня есть модель Core Data с двумя объектами: A и B. A имеет отношение к одному или нескольким объектам B. B имеет свойство bValue.

Я создаю много экземпляров класса, и некоторые из них вызывают уведомление. Это уведомление вызвало метод, который создает новую сущность B и добавляет ее в A. Экземпляры создаются с использованием NSThread, чтобы сделать пользовательский интерфейс более отзывчивым.

Это работает только тогда, когда вызывается не слишком много уведомлений. Или, по крайней мере, не слишком много одновременно.

Тогда я получаю это исключение:

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

Да, B привязан к NSArrayController.

  • Если я удалю этот ArrayController из файла NIB, все будет работать нормально (кроме всего, что должен делать ArrayController)
  • Если я создам много B и добавлю их в A в другом месте (вне метода уведомления), все будет работать, найти, также с ArrayController.

Может кто-то помочь мне, пожалуйста?

(Прошу прощения за плохое произношение.)


person Daniel    schedule 12.08.2011    source источник


Ответы (1)


Вы сказали, что делаете эту работу в отдельном потоке. Если это так, убедитесь, что вы используете отдельный NSManagedObjectContext. Вы не можете использовать один и тот же NSManagedObjectContext в нескольких потоках, а также не можете использовать NSManagedObject, связанный с одним MOC в другом MOC. Каждый поток должен независимо взаимодействовать с CoreData.

person Rob Napier    schedule 13.08.2011
comment
Но я никогда не касаюсь своего NSManagedObjectContext в этих потоках. Также это будет означать, что он вообще не работает, но при некоторых обстоятельствах, как описано выше, работает. - person Daniel; 13.08.2011
comment
Проблемы с потоками - это состояния гонки. Часто они принимают именно ту форму, которую вы описываете. Вы получаете NSManagedObject в одном потоке и обрабатываете его в другом? Вы не можете этого сделать. developer.apple.com/library/ios / # documentation / cocoa / conceptual / - person Rob Napier; 13.08.2011
comment
Хорошо, я понял. Я только что прочитал: по большей части AppKit и UIKit не являются потокобезопасными; в частности, в Mac OS X привязки и контроллеры Cocoa не являются потокобезопасными - если вы используете эти технологии, многопоточность может быть сложной. - Я полностью прочитаю вашу ссылку и постараюсь найти решение. - person Daniel; 13.08.2011