Может анализировать кеш, заменяя основные данные - программирование
Подтвердить что ты не робот

Может анализировать кеш, заменяя основные данные

Я создаю простой каталог контактов с функциями CRUD, и я хочу, чтобы функции редактирования были отключены. Моя база данных для контактов будет храниться на сервере Parse.com. Возможно ли это с использованием функциональности кеша анализа или было бы лучше для меня использовать Core Data?

4b9b3361

Ответ 1

Нет, не может. Parse просто кэширует результаты ваших запросов. Это чрезвычайно ограничивает и не то же самое, что кэширование всех ваших PFObject. Например, скажем, вы выполнили запрос для всех ваших "контактов" PFObjects. Единственное, что вы могли бы сделать с кешем, - это запустить тот же самый запрос позже (и получить тот же результат). Вы даже не могли запросить подмножество данных кэширования.

Другая проблема заключается в том, что кешированные объекты не будут обновляться с изменениями, внесенными вашим пользователем в ваши PFObjects. Например, скажем, пользователь редактирует контакты в автономном режиме, и ваш код вызывает saveEventually, чтобы сохранить эти изменения в разделе "Анализ", когда это возможно. Когда вы получите результат кэшированного запроса, пользовательские изменения не будут отображаться в ваших PFObjects. То же самое относится к удаленным и добавленным PFObjects, которые я считаю. Это заставит оффлайн использовать ужасно. Вот нить из форума Parse, затрагивающего эту тему:

https://www.parse.com/questions/does-saving-an-object-supposed-to-update-the-local-cache-of-a-query-on-these-objects

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

https://github.com/itsniper/FTASync

Вы также можете написать свой собственный код для синхронизации двух наборов данных.

Ответ 2

Parse iOS/OSX SDK предоставляет локальный хранилище данных, которое можно использовать для хранения и извлечения PFObjects, даже если сеть недоступна. Чтобы включить эту функцию, добавьте libsqlite3.dylib и вызовите [Parse enableLocalDatastore] перед вызовом setApplicationId: clientKey:.

Как указано в документации Parse:

Вы можете хранить PFObject в локальном хранилище данных, привязывая его. Закрепление PFObject является рекурсивным, подобно сохранению, поэтому любые объекты, которые на который указывает тот, который вы закрепляете, также будет закреплен. Когда объект привязан, каждый раз, когда вы обновляете его, выбирая или сохраняя новые данные, копия в локальном хранилище данных будет обновляться автоматически. Вам не нужно об этом беспокоиться.

PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = 1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore pinInBackground];

Если у вас несколько объектов, вы можете привязать их все одновременно с помощью pinAllInBackground удобный метод.

[PFObject pinAllInBackground:listOfObjects];

Получение объекта из локального хранилища данных работает так же, как получение одного по сети. Единственное различие заключается в том, что fromLocalDatastore, чтобы сообщить PFQuery, где искать его Результаты.

PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query fromLocalDatastore];
[[query getObjectInBackgroundWithId:@"xWMyZ4YE"] continueWithBlock:^id(BFTask *task) {
  if (task.error) {
    // Something went wrong.
    return task;
  }

  // task.result will be your game score
  return task;
}];

Любой PFQuery может использоваться с локальным хранилищем данных так же, как и с сеть. Результаты будут включать любой объект, который вы прикрепили соответствует запросу. Любые несохраненные изменения, внесенные вами в объект будет учитываться при оценке запроса. Таким образом, вы можете найти локальный объект, который соответствует, даже если он никогда не возвращался с сервера для этот конкретный запрос.

PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query fromLocalDatastore];
[query whereKey:@"playerName" equalTo:@"Joe Bob"];
[[query findObjectsInBackground] continueWithBlock:^id(BFTask *task) {
  if (task.error) {
    NSLog(@"Error: %@", task.error);
    return task;
  }

  NSLog(@"Retrieved %d", task.result.count);
  return task;
}];

Когда вы закончите работу с объектом и больше не нуждаетесь в локальный хранилище данных, вы можете просто отключить его.

[gameScore unpinInBackground];

Также существует способ немедленного удаления нескольких объектов.

[PFObject unpinAllInBackground:listOfObjects];

Для получения дополнительной информации об использовании локального хранилища Parse проверьте документацию Local Datastore, предоставленную для iOS/OSX на веб-сайте анализа.