Объекты, закрепленные в хранилище данных Parse Local, также удаляются при удалении на серверной части?

Предположим, что есть два iДевайса: device1 и device2. Оба устройства закрепили некоторый объект foobar, полученный из бэкенда Parse.

device1 выполняет -deleteEventually на foobar. Это приводит к тому, что объект также автоматически открепляется. Это удаление распространяется на серверную часть, и теперь серверная часть удалила foobar.

device2 выполняет запрос, который обычно возвращает foobar; разве что отсутствует.

Что происходит с foobar в локальном хранилище данных device2?


person fatuhoku    schedule 27.01.2015    source источник


Ответы (2)


Поскольку локальное хранилище данных является... локальным, объект будет храниться на втором устройстве до тех пор, пока он не получит обновление об объектах и ​​не закрепит их снова (очевидно, после открепления). Никакие изменения не будут внесены во второй, если вы не запрашиваете новые объекты из Backend.

person Cris R    schedule 03.02.2015
comment
Да, так что я думаю, что вы правы в этом — следуя моему примеру, foobar все еще закреплено на device2, поэтому выполнение запроса не изменит локальное хранилище данных: foobar по-прежнему будет доступно. Если вы хотите, чтобы удаление также происходило локально, вы должны вручную указать, что вы хотите foobar открепить, чтобы удаление произошло. Это описано в разделе «кэширование запросов» руководства Parse LDS. parse.com/docs/ios_guide#localdatastore-caching/iOS - person fatuhoku; 04.02.2015

Вот решение для этого типа проблемы, которое я использую в своем приложении:

  1. использование объектов выборки PFQuery из синтаксического анализа
  2. сделать запрос локальным и получить объекты из локального хранилища
  3. открепить объекты, если они были найдены в локальном хранилище
  4. закреплять объекты, пришедшие из сети

И пример кода:

- (BFTask *)find:(PFQuery *)query {
    return [[query findObjectsInBackground] continueWithSuccessBlock:^id(BFTask *task) {
        BFTask *(^pin)(void) = ^ {
            return [[PFObject pinAllInBackground:task.result] continueWithExecutor:[BFExecutor mainThreadExecutor]
                                                                  withSuccessBlock:^id(BFTask *task) {
                                                                      return task.result;
                                                                  }];
        };

        [query fromLocalDatastore];
        return [[query findObjectsInBackground] continueWithBlock:^id(BFTask *task) {
            if (!task.error && [task.result count]) {
                return [[PFObject unpinAllInBackground:task.result] continueWithBlock:^id(BFTask *task) {
                    return pin();
                }];
            } else {
                return pin();
            }
        }];
    }];
}
person Nastya Gorban    schedule 26.03.2015
comment
Привет, Настя. Хорошее решение, но ты каждый раз хватаешь весь PFobject. Любое решение для получения только новых данных? (В том числе удалено с панели инструментов) (см. мой пост: stackoverflow .com/questions/29323192/) - person Franck; 29.03.2015