2015-01-22 3 views
6

У меня возникли проблемы с синхронизацией моих локальных данных с данными Parse при использовании «enableLocalDataStore ». Если я не использую локальное хранилище, все в порядке, но я хотел бы минимизировать вызовы на сервер Parse. Я понимаю, что если я использую aaveEventually' для вновь созданных объектов, они будут сохраняться (закреплены) локально и синхронизироваться с Parse, когда доступно подключение к Интернету. Это также отлично работает. Моя проблема заключается в том, что я не знаю лучший способ обновить локальный «dataStore» с помощью Parse «dataStore», кроме как вызвать метод, который удаляет изменения удаленно и обновляется локально. В настоящее время используйте следующее:Синхронизация между Parse и localDataStore

-(void) fetchAllFavorites{ 
    PFQuery *query = [PFQuery queryWithClassName:@"UserStats"]; 
    [query fromLocalDatastore]; 

    [[query findObjectsInBackground] continueWithBlock:^id(BFTask *task) { 
     if (task.error) { 
     } 
     else 
     { 
      [PFObject pinAll:task.result]; 
     } 
     return task.result; 
    }]; 
} 

Этот подход не учитывает изменения, которые могли произойти в Parse 'dataStore'. Я мог бы просто отключить все локальные объекты и получить все, что есть в Parse, вызвав метод напрямую. Однако я бы подумал, что был бы более эффективный подход, который бы легко синхронизовал локальные изменения с изменениями в Parse 'dataStore'? Разве это не идея, позволяющая использовать «localDataStore» в первую очередь? В настоящее время я вижу только, что это работает в одном направлении: вы сохраняете данные локально, а затем обновляете Parse 'dataStore' вручную, но вы не синхронизируете их между собой. По крайней мере, это идея, которую я получаю от некоторого of the examples, и мне интересно, есть ли у кого-то хороший подход к тому, как: включить «localDataStore», который постоянно синхронизируется с Parse «dataStore»? Любые предложения и примеры были бы очень полезными. Я программирую в Cocoa, но примеры Java также будут замечательными. Спасибо, T.

+0

FYI, запрашивающий локальное хранилище данных, использует запрос API точно так же, как дистанционное запрос. – soulshined

+0

Я знаю, но он по-прежнему только запросы локально. Я бы хотел, чтобы он запрашивал локально сначала, и если результатов не найдено, поиск удаленно –

+0

Не заглядывали ли вы в их политики кэширования, это может обойти даже нужный локальный хранилище данных. – soulshined

ответ

1

Мое решение состояло в том, чтобы сделать локальный запрос, и если ничего не было, тогда запросите сервер. На моей странице настроек у меня есть функция, которая будет «синхронизировать» с сервером, полностью обновлять закрепленные объекты в основном. Это не так необходимо, так как каждый раз, когда пользователь редактирует, удаляет или добавляет объект, я звоню saveEventually, deleteEventually, pinInBackground, unpinInBackground, в зависимости от ситуации. Моя функция запуска выглядит так. Если локальные объекты не найдены, сервер запрашивается, и они привязаны так, что в следующий раз он будет только локальным.

PFQuery *localQuery = [PFQuery queryWithClassName:@"ClassName"]; 
[localQuery fromLocalDatastore]; // and any other constraints 
[localQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if(objects.count > 0) { 
     self.objects = objects; 
    } else { 
     PFQuery *remoteQuery = [PFQuery queryWithClassName:@"ClassName"]; 
     [remoteQuery findObjectsInBackground:^(NSArray *objects, NSError *error) { 
      if (objects) { 
       self.objects = objects; 
       [PFObject pinAllInBackground:objects]; 
      } 
     }]; 
    } 
}]; 
+0

Как это работает для получения новых обновлений после того, как у вас уже есть исходные локальные данные? Приведенный выше пример действительно имеет смысл в новой установке приложения, если у пользователя были удаленные данные, но ничего не было сохранено локально. Как вы обнаруживаете новые обновления, которые произошли на стороне сервера, когда клиент был отключен? (например: новые сообщения чата, полученные с момента последнего запуска приложения). Приведенный выше код только вытащил бы ваши предыдущие сообщения чата, которые вы сохранили локально. – Marchy

+0

У меня есть обмен сообщениями в моем приложении, и я обновляю это отдельно от этого объекта «ClassName». В моем примере показано, как я управляю объектом, который обновляется только владельцем. В обмене сообщениями я бы привязал эти сообщения, когда они вошли (я использую push-уведомления либо для обновления экрана, либо для уведомления). Другой вариант - всегда запускать удаленный запрос при запуске, и если он вернется, то отключите и соедините все объекты. Если это не соединение (нет соединения), просто используйте прикрепленные в данный момент объекты. – Raesu

0

Мой подход заключался в том, чтобы написать утилиту, которая проверяет, было ли что-то обновлено или удалено в облаке. Everytime мне нужно сделать обновление я назвал:

[[ParseLocalDataStoreManager sharedInstance]updateClasses:classes]; 
//classes is a NSArray 

я отслеживал, какие классы были уже в localStore и которые не были. Если класс не был, то я запросил и привязал все его объекты. Если бы это было так, я обновлял только те объекты, которые были изменены в облаке, после последней даты, которую я обновил. Я использовал PARSE в

[query whereKey:@"updatedAt" greaterThanOrEqualTo:lastUpdated]; 

и сохранил запись lastUpdated в 'NSUserDefaults'.

Чтобы удалить объекты, которые больше не были в облаке, я написал небольшую функцию облака, которая вернула объекты в облаке для определенного класса. Затем я сравнил их с тем, что у меня было в localStore, и удалил те, которые не были в Облаке.

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

Я загрузил программу на GitHub: https://github.com/timpalade/ParseLocalDataStoreManager

Intstructions, а также код облака можно найти на GitHub. Надеюсь это поможет!

Смежные вопросы