如何处理可选的Realm同步?

时间:2017-10-05 04:45:15

标签: swift realm realm-mobile-platform

我有一个带有本地/离线Realm文件/数据库的应用程序。我想添加登录以跨设备同步数据的选项,我认为Realm Object Server对此非常有用。我知道当用户登录时,我需要编写从本地域迁移到同步域的迁移。如果用户决定退出,我该怎么办?如果用户从未首先登录,我该怎么办?我是否需要在我的代码中(两个地方)有两个路径来选择它是应该使用本地还是同步域?

1 个答案:

答案 0 :(得分:0)

我使用RealmProvider类来获取领域实例。

class RealmProvider {
    class func realm() -> Realm {
        if let _ = NSClassFromString("XCTest") {
            return try! Realm(configuration: Realm.Configuration(fileURL: nil, inMemoryIdentifier: "test", syncConfiguration: nil, encryptionKey: nil, readOnly: false, schemaVersion: 0, migrationBlock: nil, deleteRealmIfMigrationNeeded: true, objectTypes: nil))
        } else {
            let user = getUser()
            guard let loggedInUser = user else {
                do {
                    return try Realm()
                } catch {
                    print(error)
                }
                return try! Realm()
            }
            // open up synced url to the username.
            if let user = SyncUser.current {
                let syncServerURL = URL(string: "realm://realm.myapp.com/~/\(loggedInUser.username.md5())")!
                let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: syncServerURL))

                // Open the remote Realm
                return try! Realm(configuration: config)
            } else {
                // login first.
                let serverURL = URL(string: "http://realm.myapp.com")!
                let token = getToken()

                let customCredentials = SyncCredentials(customToken: token, provider: Provider("custom/myAuth"))
                //
                SyncUser.logIn(with: customCredentials,
                               server: serverURL) { user, _ in
                                if let user = user {
                                    // can now open a synchronized Realm with this user
                                    // Open Realm
                                    let configuration = Realm.Configuration(
                                        syncConfiguration: SyncConfiguration(user: user, realmURL: URL(string: "realm://realm.myapp.com/~/\(loggedInUser.username.md5())")!)
                                    )
                                    _ = try! Realm(configuration: configuration)
                                }
                }
            }
            return try! Realm()
        }
    }
}

要回答你的问题,

  

如果用户决定退出,该怎么办?

RealmProvider将为您提供本地领域文件。

  

如果用户从未首先登录,该怎么办?   数据仍将存储在本地域文件中,一旦用户登录,您就可以打开同步域并运行迁移。

PS:有一个问题,如果第一次打开同步域,它仍将返回本地域文件。 :/