Обновление: этот поток идентифицирует ошибку в NSCollectionView, когда представленными объектами представления коллекции являются NSManagedObjects. Ошибка срабатывает следующим образом;
(a) Удалить объекты из NSArrayController (b) Выполнить сохранение связанного контекста nsmanagedobjectcontext в любое время после удаления и до того, как NSCollectionView завершит свою анимацию.
Эти проекты на github демонстрируют проблему.
https://github.com/artifacts/NSCollectionViewCoreDataBug https://github.com/iracooke/CoreDataCollectionViewCrashing
Оригинальный вопрос ниже
У меня есть установка NSCollectionView с привязкой содержимого к аранжированным объектам NSArrayController объектов основных данных. В моем представлении элемента коллекции (прототип представления NSCollectionView) у меня есть несколько элементов управления, привязанных через представленный объект моего элемента представления коллекции к моим объектам основных данных.
По большей части это работает нормально.
Я сталкиваюсь с objc_exception, когда пытаюсь удалить объекты из моего ArrayController. Я удаляю эти объекты просто по телефону;
[myArrayController removeObject:managedObjectToDelete];
К сожалению, когда я делаю это, я часто получаю сообщение об ошибке «CoreData не может выполнить ошибку»... с ответственным объектом, являющимся одним из объектов, управляемых NSArrayController.
Изучение стека вызовов при возникновении исключения показывает, что сбой возникает, когда NSCollectionView получает свой метод _endOfAnimation. Это, в свою очередь, инициирует другие методы, связанные с отвязкой (вероятно, свойств моей сущности с элементами управления в моем представлении).
Еще одна информация заключается в том, что Entity, с которой я работаю, не имеет отношения к другим объектам в моей модели.
Мне кажется, что возникает следующая проблема;
- Когда я удаляю объекты из своего NSArrayController, они, в свою очередь, удаляются из контекста.
- После удаления из контекста объекты превращаются в разломы
- NSCollectionView сохранил ссылки на объекты (теперь ошибки). Он пытается очистить их в конце своей анимации (отвязка и т. д.).
- Когда NSCollectionView пытается очистить привязки к объекту, это приводит к тому, что основные данные пытаются вызвать ошибку на объекте (надеюсь, я правильно понял свою терминологию). Это вызывает ошибку, поскольку объект еще не сохранен на диск.
Единственный способ, который я могу придумать, чтобы предотвратить это, - это сохранить объекты в хранилище (путем их сохранения) перед удалением. Это работает, но только хакерским способом, так как мне нужно убедиться, что один раунд удаления завершен перед повторным сохранением ... и поскольку ошибка возникает во время анимации ... после некоторой задержки ... и два сохранения подряд будут приводит к повторению той же ошибки.
Означает ли это, что я не могу использовать NSArrayController с поддержкой Core-Data для заполнения NSCollectionView? Если нет, то что я делаю неправильно? Есть ли лучший способ решить эту проблему?