Различные конфигурации Realm, появляющиеся в приложении Swift

Swift 3, Xcode 8, RealmSwift 2.0.2, сервер объектов Realm 1.0

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

let username = "test"
let password = "test"

let address = "http://1.1.1.1:9080"
let syncAddress = "realm://1.1.1.1:9080/~/myapp"

SyncUser.authenticate(with: Credential.usernamePassword(username: username, password: password, actions: []), server: URL(string: address)!, onCompletion: { user, error in
    guard let user = user else {
      fatalError(String(describing: error))
    }

    // Open Realm
    Realm.Configuration.defaultConfiguration = Realm.Configuration(
      syncConfiguration: (user, URL(string: syncAddress)!)
    )
 })

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

Затем я установил объект realm в качестве свойства класса в двух отдельных контроллерах представления:

class TableViewControllerA: UITableViewController{
  let realm = try! Realm()
  override func viewDidLoad() {
    // CORRECT: Prints "nil" as it should for a remotely synced Realm instance
    print(realm.configuration.fileURL)
  }
}

...и еще один в другом файле:

class ViewControllerB: UIViewController{
  let realm = try! Realm()
  override func viewDidLoad() {
    // WRONG: Prints the path to the local realm file in the Simulator
    print(realm.configuration.fileURL) 
  }
}

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

Могу ли я не ожидать надежного сохранения конфигурации Realm в моем приложении? Нужно ли мне делать что-то еще, чтобы использовать ту же конфигурацию?


person Clifton Labrum    schedule 07.10.2016    source источник
comment
Дважды проверьте, что ваш контроллер представления не создается до того, как вы установили конфигурацию по умолчанию.   -  person bdash    schedule 08.10.2016
comment
Я устанавливаю конфигурацию по умолчанию в своем делегате приложения. Разве мне не гарантировано, что это произойдет первым?   -  person Clifton Labrum    schedule 08.10.2016
comment
Код, который вы разместили, показывает, что вы устанавливаете конфигурацию по умолчанию в обратном вызове, который вызывается асинхронно после аутентификации пользователя.   -  person bdash    schedule 08.10.2016
comment
Ах, хороший улов - состояние гонки! Но я предполагаю, что конфигурация должна быть в этой асинхронной функции, так как мне нужен user для установки конфигурации.   -  person Clifton Labrum    schedule 08.10.2016
comment
@bdash Если вы хотите опубликовать свой ответ об асинхронной функции в качестве ответа, я отмечу его как принятый. В этом была проблема. Большое спасибо!   -  person Clifton Labrum    schedule 08.10.2016


Ответы (1)


Вы устанавливаете конфигурацию по умолчанию в обработчике завершения аутентификации. Этот обратный вызов вызывается асинхронно после аутентификации пользователя. Если экземпляр одного из ваших подклассов контроллера представления будет создан до запуска обратного вызова, область, которую он открывает, будет использовать конфигурацию по умолчанию default до любых изменений, которые вы сделаете в обработчике завершения аутентификации.

person bdash    schedule 08.10.2016
comment
Как лучше всего избежать этой ситуации? - person Daniel; 08.10.2016
comment
Я избежал этого, заблокировав остальную часть моего пользовательского интерфейса экраном аутентификации пользователя. Как только пользователь входит в систему, я программно загружаю другую раскадровку. - person Clifton Labrum; 08.10.2016
comment
Забавно - именно то, что я сделал - было интересно, использовал ли кто-нибудь семафор или какой-либо другой метод, чтобы дождаться завершения обработчика завершения. Спасибо! - person Daniel; 08.10.2016