Облачная функция возвращает разные результаты в зависимости от платформы

У меня есть функция Parse Cloud Code, которая представляет собой простой запрос для запроса корневого объекта и получения его дочерних объектов и их дочерних объектов (3 уровня иерархии объектов).

Set
|--> Group
     |--> Item

Я делаю это таким образом, потому что Set уже может быть на устройстве, и я не могу найти надежный способ убедиться, что у меня есть последняя копия. fetchInBackground... может сработать, за исключением того, что вы не можете сделать include, которое мне нужно сделать, чтобы получить детей/внуков. (Я не могу понять, почему Parse не добавил эту функцию. Я не могу сказать вам, сколько раз я хотел сказать «обновить этот объект, включая эти дочерние объекты»!)

В любом случае, функция Cloud Code работает, но выдает странные результаты:

  1. Когда я запускаю запрос из консоли REST API, я получаю все ожидаемые данные. В частности, я получаю 1 объект Set, 3 объекта Group, принадлежащих этому набору, и объекты Item, принадлежащие каждому Group. В частности, 3-й Group из Set содержит 67 Item объектов.
  2. Когда я запускаю запрос с устройства iOS (или симулятора), третий Group последовательно возвращается с 51 Item объектами. Интересно, что это БЫЛО верно до обновления модели данных на сервере.

Итак, несмотря на все мои усилия, я не могу обновить модель данных, закрепленную на моем устройстве, чтобы отразить изменения, внесенные на сервере. Что меня ДЕЙСТВИТЕЛЬНО сбило с толку, так это то, что, несмотря на вызов функции облачного кода, модель данных на устройстве возвращается.

Я предполагаю, что когда объект возвращается из функции, она видит, что объект уже закреплен и не включает новые данные с сервера. Чего я не могу понять, так это как обойти это. Я хочу, чтобы данные были закреплены, потому что я не хочу управлять своим собственным локальным хранилищем данных (хотя, думаю, при необходимости я это сделаю). Я пытался открепить объект Set непосредственно перед вызовом функции Cloud Code, но это не меняет результатов, даже если я запускаю вызов unpin синхронно.

Я только что потратил несколько часов, пытаясь сделать свою собственную последовательность обновления, например:

  1. Обновить Set
  2. Повторить Group объектов Set, обновив их
  3. Перебрать Item объектов каждого Group, обновив их.

Хотя это, кажется, работает хорошо, когда процесс выполняется, как только я дохожу до конца процесса, данные 2-го и 3-го уровня не сохраняются.

Я чувствую, что это должна быть тривиальная реализация. Многие просили об этой функции. Кто-нибудь понял, как выполнить «выборку с включением»?


person mbm29414    schedule 15.10.2015    source источник


Ответы (1)


Если у вас есть object ID из set, которые вы хотите обновить, вы можете создать запрос в классе set и ограничить object ID. Затем вы можете использовать метод includeKey:, чтобы получить соответствующие данные, а затем получить данные.

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

person hhanesand    schedule 18.10.2015
comment
Это именно то, что я описал в своем вопросе. Когда я делаю это, объект, который я возвращаю, кажется, отбрасывается в пользу элемента, который уже находится в локальном хранилище данных. - person mbm29414; 18.10.2015
comment
Вы пробовали запрос идентификатора объекта? Я бы также попробовал переустановить приложение (удалить на телефоне), чтобы увидеть, есть ли в вашем LDS неверные данные или что-то в этом роде. - person hhanesand; 18.10.2015
comment
Да. Похоже, нет никакого способа игнорировать результаты, которые уже находятся в локальном хранилище данных. И я не могу просто сделать fetchInBackground, потому что это не позволяет мне получать дочерние и особенно великие дочерние объекты. - person mbm29414; 18.10.2015