Когда вызывать 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 секунд (при сохранении основного и основного) вставляется новая новая строка. (сначала вставленная строка имеет временный идентификатор, а самая новая вставка имеет постоянный идентификатор).

One Solution collect form web for “Когда вызывать getPermanentIDsForObjects :?”

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

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

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

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

  • Исходный поток iOS из аутентифицированного URL-адреса
  • Как увеличить область попадания UIGestureRecognizer?
  • Строка состояния изменяет цвет при поиске
  • BluetoothManager не работает на iOS 7
  • Почему прокрутка iframe не работает на мобильном Safari?
  • Каков наилучший способ найти каталог документов пользователя на iPhone?
  • iOS TableView crash загрузка различных данных
  • iOS view 'folding' animation
  • setHidden: имеет нежелательную задержку
  • Передача целого числа между сценами, iphone game sprite-kit
  • iOS Mic: захваченный голос - изменение объема обработки на лету
  • Interesting Posts

    Удаление приложения iOS с документами в папке с поддержкой iCloud

    Поддерживает ли Firebase Cloud Messaging услуги VOIP pushkit?

    Как сделать DIV получать фокус Voiceover, когда он не содержит фокусного HTML?

    Предварительная загрузка webView не работает – попытка уменьшить время загрузки

    Что такое XMPP, и как я могу использовать его в приложении чата iOS?

    что делать для голосового приложения для iOS?

    Как игнорировать слова, содержащие подстроки с помощью компонентовSeparatedByString :?

    Циркуляр UIImageView в UITableView без производительности ударил?

    coredata – доставить / настроить данные по умолчанию

    Как проверить устройство на iPhone 5?

    Знайте, если уведомление iOS было уволено

    cellForRowAtIndexPath: не называется

    Программно найти, если iPad находится на IPv4 или сети IPv6

    TWTRLogInButton – ошибка NSURLErrorDomain -1012

    Нет установленных профилей подготовки, соответствующих установленным ключам подписи кода iOS

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.