领域默认同步文件

时间:2017-02-21 09:22:20

标签: swift realm realm-mobile-platform

学习如何使用 Realm Mobile Platform。

我构建了一个小型iOS应用程序,可以成功地将数据保存到服务器,并且数据在不同设备上保持一致。该应用与official realm tutorial非常相似。

我可以从领域浏览器Mac应用程序打开同步URL,我看到实时发生的变化很好。这就是我被困住的地方:我正在尝试查看本地域文件中的更改,但

print(self.realm.configuration.fileURL)返回nil 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)数据在用户离线时可用。

1 个答案:

答案 0 :(得分:1)

当您第一次登录时,Realm会自动将用户存储在钥匙串中。然后,您可以通过SyncUser.currentUser属性检索它,即使您已离线,也可以使用它来打开您的领域。但是,如果您注销该用户,则您无法离线使用它。

使用realm.configuration.fileURL

syncConfiguration不可用。

对于这种情况:

  1. 只打电话SyncUser.logIn
  2. 对于正常的应用程序运行(即除了初始运行以外的所有运行),o 使用相同的配置写入领域。
  3. 你应该有这样的东西:

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