2016-12-04 17 views
1

Я искал синхронизацию в реальном времени, как реализовано в примере приложения «Задачи» в Realm.Можно ли использовать реальную синхронизацию реального сервера объектов Realm без индексов?

В частности, этот блок:

private func setupNotifications() -> NotificationToken { 
    return parent.items.addNotificationBlock { [unowned self] changes in 
     switch changes { 
     case .Initial: 
      // Results are now populated and can be accessed without blocking the UI 
      self.viewController.didUpdateList(reload: true) 
     case .Update(_, let deletions, let insertions, let modifications): 
      // Query results have changed, so apply them to the UITableView 
      self.viewController.tableView.beginUpdates() 
      self.viewController.tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) 
      self.viewController.tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) 
      self.viewController.tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .None) 
      self.viewController.tableView.endUpdates() 
      self.viewController.didUpdateList(reload: false) 
     case .Error(let error): 
      // An error occurred while opening the Realm file on the background worker thread 
      fatalError(String(error)) 
     } 
    } 
} 

В основном изменения передаются с помощью индексов. Путем простого доступа к объекту подклассов/объектам области, используя эти индексы, интерфейс обновляется.

Теперь у меня есть архитектура, которая не кажется совместимой с этим. У меня есть выделенный уровень базы данных (из которых realm - это реализация), где я загружаю объекты области в фоновый поток и сопоставляюсь с обычными объектами модели. Таким образом, я отключаю свой код от реализации базы данных и могу использовать неизменяемые модели.

Я не уверен, как обрабатывать индексы в этом случае. Похоже, я должен запомнить исходный запрос, сделать это снова, а затем получить доступ к записям, которые мне нужны, используя эти индексы? Это звучит очень неэффективно ...

Кроме того, я не знаю, как индексы работают с определенными запросами типа «все элементы, имеющие статус x в поле y». Получается ли индекс, который я получаю, относится к этому конкретному запросу?

Каков рекомендуемый способ продолжения здесь?

Редактирование: просто для добавления дополнительных комментариев я реализовал синхронизацию с использованием настраиваемого сервера и веб-сайтов, и вместо семантических ключей я использовал семантические ключи (иногда даже отправлял полный объект, чтобы избежать необходимости запрашивать базу данных). Таким образом, я не имел дело с возможными несоответствиями, связанными с доступом на основе индексов. Интересно, если что-то подобное возможно или планируется с помощью Realm sync в какой-то момент.

P.S. Я намерен переключиться на Realm sync, потому что мой пользовательский сервер не очень хорошо протестирован и очень сложно поддерживать. Надеюсь, что это возможно.

+0

Рекомендуется использовать базу данных нулевой копии как базу данных с нулевой копией, а не отображать все, но вы можете прочитать об этом в [официальной документации] (https://realm.io/ docs/swift/latest/#) – EpicPandaForce

+0

Ну, развязка кода интерфейса из реализации БД была тем, что позволило мне в первую очередь переключиться на сферу. Конечно, у меня есть недостатки, я знаю об этом. – Ixx

ответ

1

Все запросы в области недвижимости возвращают Results, это тип контейнера auto-updating, поэтому вам не нужно снова делать запрос. Вы можете установить notification handler для любого конкретного Result и получать уведомление, когда эта коллекция будет изменена для обновления ваших сопоставленных моделей.

+0

Хорошо. Это будет сложно, потому что моя архитектура не реактивна. Я использую провайдеры без гражданства, где я получаю данные через обратные вызовы. Нужно что-то придумать, возможно, я закончу использование 'Result' непосредственно в контроллерах. Просто чтобы подтвердить, если у меня есть запрос с несколькими фильтрами/предикатами, индексы, которые я получаю, относятся к этому конкретному результату, т. Е. Включая все фильтры, правильно? – Ixx

+1

@ lxx да, это так. – Dmitry

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

  • Нет связанных вопросов^_^