Почему NSArrayController «теряет» свою сортировку после вставки объекта? - PullRequest
4 голосов
/ 04 августа 2011

У меня есть NSArrayController, связанный со свойством подкласса NSManagedObject. Подкласс автоматически генерируется mogenerator (который создает свойство набора для отношения).

NSArrayController связан с network.posts, где 'posts' - это отношение 1-M. Примечание. Я привязан к 'posts', а не к accessors mutableSet postsSet, сгенерированному mogenerator.

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

Затем я добавляю новый объект, создавая экземпляр объекта, а затем добавляя его в отношение.

NSArrayController правильно наблюдает за этим изменением, и новый объект появляется в ограмм_Объектах , однако после вставки порядок сортировки упорядоченных_Объектов теряется и записи появляются в другом порядке.

Я убедился, что дескриптор сортировки по-прежнему установлен правильно. NSArrayController имеет autoRearrangeContent = YES. Я даже пытался вручную вызвать -rearrangeObjects после вставки, но порядок сортировки остается неправильным.

Если я закрою окно и открою заново, только что созданный экземпляр NSArrayController снова получит данные с правильным порядком сортировки. Пока я не сделаю еще одну вставку.

Мой опыт показывает, что NSArrayController автоматически сохраняет правильный порядок сортировки при добавлении / удалении объектов, но, может быть, это было счастливое совпадение?

Я не могу найти какое-либо описание правильного поведения в документе Apple, поэтому не знаю, чего ожидать, что может пойти не так (если что-нибудь) или - в любом случае - что мне с этим делать .

1) Учитывая, что sortDescriptor должен NSArrayController сохранять упорядоченные объекты, отсортированные после вставки / удаления объектов из базовой коллекции?

2) Если так, что могло бы предотвратить это?

3) И, если нет, как правильно отсортировать объекты?

Буду благодарен за любую помощь. В этой ситуации не просто предоставить полезный исходный код, поскольку в принципе его нет. Но я с удовольствием уточню и отвечу на любые последующие вопросы.

Ответы [ 3 ]

5 голосов
/ 22 августа 2011

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

1 голос
/ 04 августа 2011

По чему вы сортируете?Основные данные не поддерживают упорядоченные коллекции.Чтобы сохранить любой порядок, вы должны добавить некоторый sort атрибута (каламбур) и отсортировать по нему.

За кулисами CD использует NSSet / NSMutableSet - не NSArray / NSMutableArray - для коллекций.То, что ваши объекты появляются в одном и том же порядке более одного раза, полностью связано с кэшированием, а не с помощью CD, поддерживающего порядок вашей коллекции.

Обновление для Lion (10.7)

Что касается моего утверждения «не поддерживает упорядоченные коллекции»: если вы нацеливаетесь на 10.7 и выше в своем приложении, [NSManagedObject теперь дает упорядоченные отношения.] [1] Используйте -mutableOrderedSetValueForKey: и -mutableOrderedSetValueForKey: установить и получить NSOrderedSets.Ура!

0 голосов
/ 04 августа 2011

Возможно, вместо того, чтобы связывать NSArrayController с вашим attributesSet (сгенерированным mogenerator), вам следует вместо этого связать само базовое динамическое свойство attributes, которое создается платформой Core Data? attributes обозначает имя вашего отношения.

...