Когда вызывать getPermanentIDsForObjects :?

В настоящее время у меня проблема с созданием нового объекта в фоновом дочернем потоке (родительский – это основной контекст потока пользовательского интерфейса) и сохранение заставляет мой NSFetchedResultsController показывать два новых объекта: один с временным objectID и один с постоянным objectID , Кажется, это какая-то ошибка, если я не пропущу что-то.

Поэтому я решил вручную получить постоянные идентификаторы для любых новых объектов, которые я создаю. Это исправляет проблему с повторяющейся строкой, но вводит новые случайные ошибки (например, «не может выполнить ошибку для объекта», ссылаясь на новый объект, который я создал). Если у кого есть какие-либо идеи относительно того, почему происходит какое-либо из упомянутых ранее событий, пожалуйста, поделитесь.

Я предполагаю, что obtainPermanentIDs – это шаг в правильном направлении. Но когда я называю этот метод? Перед сохранением в контексте ребенка? После сохранения ребенка и перед родителем? После родителя? В настоящее время моя настройка такова:

 masterMOC - private queue tied to the persistent store, so physical saves happen here ----mainMOC - main queue tied to the UI, child of masterMOC -------backgroundMOC - private queue, child of mainMOC 

Поэтому, если я создаю новый объект на backgroundMOC , и я намерен немедленно сохранить его на диск (это означает, что мне придется вызвать save: во всех трех контекстах), где я должен называть obtainPermanentIDs ?

(или если у кого-то другое решение, кроме вызова, получить постоянные идентификаторы? Какая проблема была введена в любом случае для решения? Почему бы мне назвать этот метод?)

Обновление: я думаю, что я понял, что происходит (это только теория), хотя и не так, как ее решить. Core Data, по-видимому, генерирует постоянные идентификаторы для объектов, когда они физически сохраняются на диск. Так что в моем случае это произойдет не до тех пор, пока я не вызову save на masterMOC. В настоящее время я создаю новый объект на backgroundMOC:

  1. сохранить на backgroundMOC (чтобы изменения были сдвинуты на один уровень до mainMOC, и мой вид таблицы может вставлять новые строки)
  2. сохранить на mainMOC (чтобы я мог подготовиться к сохранению на диске)
  3. сохранить на masterMOC (который, наконец, сохраняет на диск)

Что здесь происходит, так это то, что вызов save на backgroundMOC запускает обновление пользовательского интерфейса и заставляет получателя результатов вводить новый объект, который все еще имеет только временный идентификатор. Но затем вызов save на masterMOC заставляет все объекты получать назначенные постоянные идентификаторы, что вызывает другое обновление пользовательского интерфейса, вставляя еще одну строку для этого «нового» объекта! Комментируя последнее сохранение masterMOC, я больше не вижу повторяющихся записей. Я здесь что-то не так, или это какая-то ошибка?

Еще одно обновление: я думаю, что в значительной степени подтвердил эту ошибку. Я вызываю save на backgroundMOC, а затем настраиваю таймер для вызова save на mainMOC и masterMOC через 5 секунд. Immediatley при сохранении на backgroundMOC, новая строка вставляется в мою таблицу. Через 5 секунд (при сохранении основного и основного) вставляется новая новая строка. (сначала вставленная строка имеет временный идентификатор, а самая новая вставка имеет постоянный идентификатор).

У меня была такая же проблема, конечно, после особо сложного и унылого дня отладки всего, чтобы выяснить, что проблема была временными идентификаторами. 🙂

Я имею ту же структуру, что и вы, и у меня также есть подклассы NSManagedObjectContext, чтобы кодифицировать поведение, которое я ожидаю от сохранения в фоновом режиме и основных контекстах, а именно: сохранение в фоновом контексте должно сохранить основной контекст (а основной контекст должен синхронизировать любые объекты, которые были изменены с внешней службой, что не имеет значения, но стоит упомянуть в качестве объяснения, почему у меня есть два подкласса), а сохранение в главном контексте должно сохранить главный контекст.

В моем подклассе RFSImportContext (что эквивалентно вашему backgroundMOC) я реализую - save: для вызова [super save:] , затем вызывается [self.parentContext performBlock:] (self.parentContext здесь эквивалентен вашему mainM) C, где вызовы блоков obtainPermanentIDsForObjects: с содержимым массивов основного контекста - updatedObjects и - insertedObjects - updatedObjects , тогда я сохраняю основной контекст.

У меня больше нет утечки временных объектов в свой NSFetchedResultsController, как вы описали. Для улучшения ситуации немного было бы использовать подкласс RFSMainContext (опять же, эквивалентный вашему mainMOC) для реализации - save: для получения идентификаторов постоянных объектов, сохранения себя, а затем сохранения основного контекста. Это кодирует поведение, которое мы всегда хотим, чтобы основной контекст имел постоянные идентификаторы для объектов в нем, когда он сохраняется.

  • CoreData - обновить модельный класс вместо создания новых
  • Перенос основных данных - добавление нового объекта и переупорядочение старых отношений
  • Sqlite или Core Data для обновления более 50000 записей
  • Ошибка Core Data: : объект не может быть nil
  • Основные данные NSFetchedResultsController не обновляется после batchUpadate на устройстве, но нормально на симуляторе
  • swift - JSON для NSManagedObject
  • Убедитесь, что UI (управляемый) документ уже находится в iCloud через URLForUbiquityContainerIdentifier + Path вместо NSMetadataQuery?
  • core data - атрибут fetch, который соответствует одному из значений в массиве
  • Core Data возвращает NSArrays вместо NSStrings
  • Сбой при использовании агрегатной операции: «ВСЕ» в приложении IOS Core Data
  • Как отсортировать выборку в основных данных
  • Interesting Posts

    iPhone TCP Communication

    Зависимости Cocoapods от модуля динамической структуры

    Как скрыть определенный раздел в UITableViewController об изменении UISwitch в swift

    Пользовательские анимации UIViewController и модальные режимы презентации

    Как заставить текстовые метки масштабировать размер шрифта на разных экранах продуктов Apple?

    Прокрутите длинный текст внутри WKInterfaceLabel?

    какая разница между объявлением переменной в .m vs в .m, но с категорией в объекте c

    Как сделать UIPickerView с помощью кнопки «Готово»? стриж

    создайте много AVCaptureVideoPreviewLayer (IOS Camera) из той же AVCaptureSession и добавьте их на один и тот же уровень

    UIViewController viewDidLoad

    Буферы протокола Google для iOS / Objective-C

    Что означает пользовательский UUID для BLE в примере IOS?

    Как составить список файлов в папке и вставить каждую строку из этого списка в * .plist через терминал?

    Файл архива Xcode создается с помощью внешней библиотеки

    установить ключи ATS в файле расширения.

    Давайте будем гением компьютера.