2017-02-21 3 views
1

Обучение использованию Realm Mobile Platform.Realm default sync file

Я построил небольшое приложение для iOS, которое успешно сохраняет данные на сервере, и данные согласованы на разных устройствах. Приложение очень похоже на official realm tutorial.

Я могу открыть URL-адрес синхронизации из приложения Realm Browser Mac Application, и я вижу, что изменения происходят нормально в реальном времени. Это где я застрял: Я пытаюсь увидеть изменения в локальном файле царств, но

print(self.realm.configuration.fileURL) возвращает нильполугруппы print(Realm.Configuration.defaultConfiguration.fileURL) пустой файл

Это мой код:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in 
    guard let user = user else { 
     fatalError(String(describing: error)) 
    } 

    DispatchQueue.main.async { 
     // Open Realm 
     let configuration = Realm.Configuration(
      syncConfiguration: SyncConfiguration(
       user: user, 
       realmURL: URL(string: "realm://myIPaddress/~/realmtasks")!) 
      ) 

     self.realm = try! Realm(configuration: configuration) 

     // Show initial tasks 
     func updateList() { 
      self.items = Array(self.realm.objects(Row.self)) 
      self.tableView.reloadData() 
     } 

     updateList() 

     print(self.realm.configuration.fileURL) 
     //returns nil 

     print(Realm.Configuration.defaultConfiguration.fileURL) 
     // I can open the file, but it's empty 

     // Notify us when Realm changes 
     self.notificationToken = self.realm.addNotificationBlock { _ in 
      updateList() 
     } 
} 

Причина, по которой я тестирую это, заключается в том, что я могу загрузить данные из файла, а не из сервера. Так что: (a) логин будет вызываться только один раз (b) данные доступны, когда пользователь находится в автономном режиме.

+0

Можете ли вы представить подробную информацию о аварии? т.е. как воспроизвести его и т. д.? Очевидно, что синхронизация не может произойти, когда устройство отключено, однако у вас все еще есть доступ к данным, которые были синхронизированы * до того, как * был отключен. При выполнении начальной аутентификации пользователя приложение должно быть подключено к сети. – teotwaki

+0

@teotwaki Я, кажется, неправильно сформулировал свой вопрос. Простите за это. Перефразировать: у меня создалось впечатление, что использование ROS создаст зеркальный файл на диске. После дальнейших экспериментов я создал файл realm, который будет находиться на устройстве, а затем накладывать изменения на другой файл realm на сервере всякий раз, когда происходит изменение. Область на сервере предназначена для резервного копирования, а файл на диске является основным автономным. Я не уверен, что это хорошая/плохая практика, но я отправлю свой эксперимент после завершения, чтобы получить обратную связь. Большое спасибо за Ваш ответ. –

+0

Нет понятия «Царство на сервере». Вы всегда работаете с локальным файлом, даже для запросов/модификаций.Если файл синхронизирован, его история реплицируется на сервере, что позволяет другим клиентам загружать историю и повторно собирать Realm локально. Вы по существу делаете то же самое, что и ROS. – teotwaki

ответ

1

Когда вы впервые входите в систему, Realm автоматически сохраняет пользователя в цепочке ключей. Затем вы можете получить его через SyncUser.currentUser и использовать его, чтобы открыть свое царство, даже если вы в автономном режиме. Однако, если вы выйдете из системы, вы не сможете использовать его в автономном режиме.

realm.configuration.fileURL не доступен при использовании syncConfiguration.


Для этого случая:

  1. Вызов SyncUser.logIn только один раз
  2. Для нормального приложения работает (т.е. всех трасс, кроме первоначального запуска), о пера царств с той же конфигурацией.

Вы должны иметь что-то вроде этого:

// First launch 
if launchedBefore == false { 
    setupRealm() 

// All other launches 
} else if launchedBefore == true { 
    let user = SyncUser.current! 
    openRealm(forUser: user) 
} 

openRealm(forUser: SyncUser) в основном такая же, как и весь диспетчерский блок из предыдущего кода.

setupRealm() можно назвать слишком, чтобы очистить код:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in 
    guard let user = user else { 
     fatalError(String(describing: error)) 
    } 

    self.openRealm(forUser: user) 
} 
+0

Извините, я не совсем понимаю. В настоящее время 'default.realm' пуст. Заполняется ли он автоматически _after_ Я использую 'SyncUser.currentUser'? И каков правильный способ его открытия в этом случае? –

+0

@Jalal вы указываете URI для области, которую вы открываете, поэтому имя файла будет отличаться от 'default.realm'. 'default.realm' используется только при использовании конструктора по умолчанию (то есть:' let realm = Realm() '). Имейте в виду, что при открытии Real-Sync'd местоположение локального файла скрывается от вас. Вы не должны пытаться получить к нему доступ вручную. – teotwaki

+0

@teotwaki Wow спасибо! Ваш комментарий помог мне увидеть, как мой подход к тестированию был неправильным. –

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