ios - Swift App 中出现不同的 Realm 配置

标签 ios swift realm realm-mobile-platform

Swift 3、Xcode 8、RealmSwift 2.0.2、Realm 对象服务器 1.0

在我的应用委托(delegate)中,我有一个函数可以设置我的 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() 的所有实例都将使用此配置。

然后我在两个单独的 View Controller 中将一个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 的两个实例是不同的。在我的一些 View Controller 上,我可以将对象保存到服务器并看到它们出现在我的设备上。在其他 View Controller 上,我看不到任何数据,因为它使用了错误的 Realm 数据库。

难道我不能可靠地期望 Realm 配置在我的应用程序中持续存在吗?我是否需要执行其他操作才能使用相同的配置?

最佳答案

您正在身份验证完成处理程序中设置默认配置。在用户通过身份验证后异步调用此回调。如果您的 View Controller 子类之一的实例恰好在回调运行之前创建,则它打开的 Realm 将使用默认默认配置,在您对身份验证完成处理程序进行任何更改之前。

关于ios - Swift App 中出现不同的 Realm 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39927239/

相关文章:

javascript - 使用 angularjs 在 iOS 上聚焦文本区域

ios - 如何在多个 viewController 之间重用组件?

swift - 如何制作一个快速字典来保存两个项目,这些项目是其他项目的数组

java - Realm.io [Java] 通知 - 如何仅监听特定表中的更改?

java - Android 上不区分大小写的 Realm findAll

ios - Mac/iPhone 应用程序 - 将核心数据同步到 iCloud 和设备(使用核心数据)

ios - 从特定单元格获取开关状态

swift - 在 Swift 中将 TapGestureRecognizer 添加到 UILabel

swift - 在 Swift 中初始化没有数据的 Realm 对象

iphone - 双分屏