Файл синхронизации по умолчанию в области

Узнайте, как использовать мобильную платформу Realm.

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

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

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()
        }
}

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


person j_theislander    schedule 21.02.2017    source источник
comment
Можете ли вы предоставить подробную информацию о сбое? т.е. как это воспроизвести и тд? Очевидно, что синхронизация невозможна, когда устройство находится в автономном режиме, однако у вас все еще есть доступ к данным, которые были синхронизированы до перехода в автономный режим. При первоначальной аутентификации пользователя приложение должно быть в сети.   -  person teotwaki    schedule 27.02.2017
comment
@teotwaki Кажется, я неправильно сформулировал свой вопрос. Простите за это. Перефразируя: у меня создалось впечатление, что использование ROS создаст зеркальный файл области на диске. После дальнейших экспериментов я создал файл области, который будет находиться на устройстве, а затем отправил изменения в другой файл области на сервере всякий раз, когда происходит изменение. Область на сервере предназначена для резервного копирования, а файл на диске является основным автономным. Я не уверен, что это хорошая или плохая практика, но я опубликую свой эксперимент, как только он будет проведен, чтобы получить обратную связь. Большое спасибо за Ваш ответ.   -  person j_theislander    schedule 27.02.2017
comment
На сервере нет концепции Realm. Вы всегда работаете с локальным файлом, даже для запросов / модификаций. Если для файла включена синхронизация, его история реплицируется на сервере, что позволяет другим клиентам загружать историю и повторно собирать Realm локально. По сути, вы делаете то же самое, что и ROS, вручную.   -  person teotwaki    schedule 27.02.2017
comment
Ok! Прерывание эксперимента. ???? Завтра снова буду тестировать. Включена ли синхронизация файлов по умолчанию?   -  person j_theislander    schedule 27.02.2017
comment
Это если вы откроете Царство с syncURL.   -  person teotwaki    schedule 27.02.2017
comment
Default.realm остается пустым. Я переформулировал свой первоначальный вопрос так, чтобы, по-моему, было больше смысла.   -  person j_theislander    schedule 28.02.2017


Ответы (1)


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

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


В этом случае:

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

У вас должно получиться что-то вроде этого:

// 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)
}
person Dmitry    schedule 28.02.2017
comment
Извините, я не совсем понимаю. В настоящее время default.realm пуст. Заполняется ли он автоматически после использования SyncUser.currentUser? И как его открыть в этом случае? - person j_theislander; 28.02.2017
comment
@Jalal вы указываете URI для области, которую вы открываете, поэтому имя файла будет отличаться от default.realm. default.realm используется только при использовании конструктора по умолчанию (например: let realm = Realm()). Обратите внимание, что при открытии синхронизированной области расположение локального файла скрыто от вас. Вы не должны пытаться получить к нему доступ вручную. - person teotwaki; 28.02.2017
comment
@teotwaki Вау, спасибо! Ваш комментарий помог мне понять, насколько неправильным был мой подход к тестированию. - person j_theislander; 01.03.2017