iOS: результаты CKFetchNotificationChangesOperation неполные

Я создаю приложение для iOS, которое в значительной степени зависит от CloudKit в качестве источника данных.

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

Эта операция выполняется каждый раз, когда я запускаю приложение для проверки изменений данных с момента получения последнего токена изменения сервера. Очевидно, что при первом запуске приложения токен изменения, который я должен предоставить, равен нулю, что приведет к тому, что CKFetchNotificationChangesOperation загрузит ВСЕ изменения, когда-либо произошедшие в базе данных.

Данные, которые затем возвращаются, будут храниться локально, так как я хочу иметь локальный кеш со всеми данными, относящимися к моему пользователю. Я храню эти данные в базе данных Core Data. Поскольку набор данных, необходимый приложению при первом запуске, может быть большим, мне действительно нужно CKFetchNotificationChangesOperation для получения ВСЕХ изменений на сервере.\

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

Очевидно, я проверил, что мои подписки являются законными (те же записи были загружены ранее), и я проверил, является ли параметр moreComing CKFetchNotificationChangesOperation истинным (всегда false)

Вопрос

Что я должен сделать, чтобы получить ВСЕ данные в моей общедоступной базе данных при начальной загрузке? Я думал, что CKFetchNotificationChangesOperation должен выполнять эту работу, но это кажется ненадежным. Есть ли что-то вроде «области», которую я могу настроить для этой операции, чтобы заставить ее загружать все мои данные? Или CKFetchNotificationChangesOperation не подходит для начальных загрузок, и я должен просто загрузить все данные, которые мне нужны, с помощью пользовательских операций?


person Joris416    schedule 31.08.2017    source источник


Ответы (1)


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

  • Записи хранятся асинхронно, что приводит к непреднамеренной задержке при заполнении локальных наборов данных. .
  • Уведомления о прочтении искажают желаемые результаты запроса/подписки.

Обе ситуации можно исправить с помощью локального хранилища (массива или словаря) записей и их метаданных. Как описано в Поддержание локального кэша CloudKit документации Apple.

Ситуация 1:

Наличие локально сохраненных записей позволит вам заполнить исходный набор данных, а также внести любые обновления изменений, ожидая завершения любых асинхронных задержек через CloudKit.

Ситуация 2:

Иметь локальный массив всех просмотренных NEW notificationID. Как описано в этом Вопросы и ответы по стеку, readNotifications, похоже, является повторяющейся проблемой. Пометка уведомления как прочитанного предотвращает возврат уведомления при будущих выборках, но может вызвать проблемы, пока база данных CloudKit не будет обновлена.

~~~~~~~~~~~~~~~~~~~~~~~~ Связанное решение ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~

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

Дайте мне знать, если у вас есть какие-либо вопросы и / или вы хотите получить какие-либо разъяснения.

•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••

••• рекомендации WWDC CloudKit (начиная с 12 :45 в видео)

person ChrisHaze    schedule 02.09.2017
comment
Спасибо за ваш ответ! Я обновил свой вопрос, так как понял, что упустил что-то важное. У меня есть желание поддерживать локальный кеш загружаемых данных. Моя проблема возникает только при первом запуске приложения, когда данные еще не кэшированы локально: уведомления, которые я получаю от изменений, не завершены. Кажется, что у CKFetchNotificationChangesOperation есть какая-то «область действия», поскольку она надежно загружает новую запись и пропускает старые записи. Теперь я сомневаюсь: должен ли я написать операцию, которая просто загружает ВСЕ данные, которые я хочу, независимо от изменений? Или продолжать в том же духе? - person Joris416; 03.09.2017
comment
Пожалуйста. Вы пытались сохранить все идентификаторы уведомлений, к которым вы обращались, на устройстве (возможно, pList), чтобы затем можно было сопоставить свой список с записями из CloudKit? - person ChrisHaze; 03.09.2017
comment
Я не уверен, что это решит проблему. Я точно знаю, что все подписки работают, так как уведомления, которые не приходят сейчас, раньше приходили. Это то, что меня так сильно смущает, и создает впечатление, что в подписке есть какой-то объем. - person Joris416; 04.09.2017
comment
Вы знакомы с тем, как база данных CloudKit использует зоны? После повторного просмотра рекомендаций WWDC CloudKit я относительно уверен, что область, на которую вы продолжаете ссылаться, на самом деле является конкретными зонами: частной, общедоступной, общей и даже пользовательской. Я обновил свой ответ ссылкой на WWDC и временем, когда команда CK их обсуждает. - person ChrisHaze; 09.09.2017
comment
Да, я знаком с зонами и точно знаю, что эта проблема не из-за них, так как я храню все свои тестовые записи в одной зоне. Я продолжаю ссылаться на область, потому что кажется, что я получаю уведомления только до определенного момента времени или до определенной суммы. Это также не имело бы смысла, так как мой параметр moreComing имеет значение false. На данный момент я создал обходной путь, который просто загружает все начальные данные и с этого момента полагается на уведомления, что отлично работает. Однако это все еще не решает основную проблему: почему я получаю неполные уведомления с ложным параметром MoreComing? - person Joris416; 10.09.2017