Вопрос по nsfetchedresultscontroller, magicalrecord, objective-c, core-data – Волшебная запись, сохранение и NSFetchedResultsController

8

Не уверен, что это проблема с тем, как спасает Magical Record, или я просто где-то допускаю ошибку noob.

Я использую NSFetchedResultController (FRC) и UITableView для отображения списка сущностей, когда пользователь нажимает «Добавить». новый View Controller с редактором выдвигается, новая сущность создается с[MyEntity MR_createEntity], Пользователь может добавить сюда дополнительные объекты, которые добавляются к основному объекту посредством отношения. Когда пользователь нажимает & quot; Сохранить & quot; в этом View Controller контекст сохраняется с помощью[[NSManagedObjectContext MR_contextForCurrentThread] MR_save]

NSFetchedResultsController, кажется, обновляется, но когда я нажимаю, чтобы отредактировать сущность, ни один из дочерних сущностей там не появляется. Кажется, что отладка показывает, что, даже если объект был сохранен, FRC все еще имеет объект с его временным идентификатором.

Я делаю наивно[self.tableView reloadData] в FRCcontrollerDidChangeContent метод делегата.

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

Похоже, что FRC отвечает на «основной поток» событие save, но на самом деле сохранение происходит в фоновом потоке, поэтому FRC его не видит. Я "проверил и все" мои " все операции (настройка FRC, создание и выборка сущностей) происходят в контексте основного потока.

Я попытался прослушать уведомления об изменениях в MR_rootSavingContext и объединить их с контекстом основного потока, что сработало, но в итоге я получил дублирующиеся строки в FRC (одна была правильной сущностью «постоянная», а другая - временной).

Ваш Ответ

2   ответа
0

что это старый ответ, но ничего из вышеперечисленного не сработало для меня и, надеюсь, поможет будущим читателям.

Для меня проблема была вызвана попыткой настроить чисто локальное хранилище, используя файл sqlite, который ранее использовался с iCloud.

По сути, я пытался реализовать iCloud с моим приложением CoreData, выполнил основные шаги по его настройке с помощью контейнера ubiquity и т. Д., Но затем вернулся назад из-за присущей ему нестабильности, которая, как казалось, вызывала (почему CoreData и iCloud STILL не ладят? !), но какао не нравится, когда ты возвращаешься назад.

К счастью, я не сделал этого в живом приложении, поэтому его относительно легко изменить, поскольку это повлияет только на устройства разработки, но если вы переходите из iCloud в локальный магазин в живом приложении, яthink вам может понадобиться проверить одно из следующих решений:

Миграция основного хранилища данных из iCloud в локальный

8

я не уверен, что это "правильный способ сделать это" но я обнаружил, что он работает правильно, если я создал свой NSFetchedResultsController в MR_rootSavingContext вместо контекста по умолчанию, используя & quot; inContext & quot; версияMR_fetchAllSortedBy.

Я предполагаю, что это имеет смысл с точки зрения того, что FRC теперь просматривает rootSavingContext вместо одного из его дочерних элементов. Тем не менее, я бы подумал, так как я делаю все свои операции в том же потоке, что не будет проблемой.

Update: Единственный недостаток этого подхода заключается в том, что если я просто возьму[frc objectAtIndexPath:] чтобы передать его редактирующему контроллеру представления, он больше не находится в контексте по умолчанию. Обойти это можно путем повторного извлечения сущности в контексте по умолчанию с использованием NSManagedObjectContextexistingObjectWithID, Все еще не все чувствуют себя вполне правильно, но это работает для меня.

У меня есть похожая проблема, которую вы можете найтиstackoverflow.com/questions/11212702/nspredicate-not-executed к сожалению, я не знаю, что вызывает это, но у меня также есть та же самая ситуация, в которой кажется, что мой контекст по умолчанию не очень актуален (в некотором смысле).
Я тоже, и я только что прокомментировал проблему Фабиано. Использование MR_rootSavingContext, кажется, не помогает мне, и я могу использовать более раннюю версию MR, которая, как я знаю, работает.
+1, потому что это решило мою проблему, см. Мой ответ наstackoverflow.com/questions/11212702/nspredicate-not-executed/…

Похожие вопросы