使用后续领域对象使用来同步领域对象服务器连接完成

时间:2017-10-23 19:21:46

标签: ios swift realm

我正在使用Realm Object Server进行一个简单的测试项目,我遇到了同步ROS连接设置和跟踪领域对象的使用以访问数据库的问题。 在viewDidLoad中我正在调用connectROS函数来初始化realmRos对象/连接:

var realmRos: Realm!

override func viewDidLoad() {
    connectROS()
    if(FBSDKAccessToken.current() != nil){
        // logged in
        getFBUserData()
    }else{
        // not logged in
        print("didLoad, FB user not logged in")
    }
}   

func connectROS() {
    let username = "realm-admin"
    let password = "*********"
    SyncUser.logIn(with: .usernamePassword(username: username, password: password, register: false), server: URL(string: "http://146.185.154.***:9080")!)
    { user, error in
            print("ROS: checking user credentials")
            if let user = user {
                print("ROS: user credentials OK")
                DispatchQueue.main.async {
                    // Opening a remote Realm
                    print("ROS: entering dispatch Q main async")
                    let realmURL = URL(string: "realm://146.185.154.***:9080/~/***book_test1")!
                    let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: realmURL))
                    self.realmRos = try! Realm(configuration: config)
                    // Any changes made to this Realm will be synced across all devices!
                }
            } else if let error = error {
                // handle error
                print("ROS: user check FAIL")
                fatalError(String(describing: error))
            }
    }
}

在viewDidLoad函数中,下一步是获取FB登录用户(在这种情况下我使用的是FB身份验证)。获取记录的FB用户后,应用程序执行检查是FB用户是我的应用程序的新用户和我的专有ROS用户表。

func checkForExistingProfile(user: User) -> Bool {
    var userThatExist: User?

        do {
            try self.realmRos.write() {
                userThatExist = self.realmRos.object(ofType: User.self, forPrimaryKey: user.userName)
            }
        } catch let error as NSError {
            print("ROS is not connected")
            print(error.localizedDescription)
        }

    if userThatExist != nil {
        return true
    } else {
        return false
    }
}

此时checkForExistingProfile通常(并非总是)在尝试self.realmRos.write()时崩溃,这恰好是零。 我认为问题来自connectROS执行(异步)和checkForExistingProfile之间的同步,它在connectROS完成之前执行。

1 个答案:

答案 0 :(得分:0)

由于你没有说明checkForExistingProfile()之后viewDidLoad()是如何调用的,这是猜想,但基于你所描述的其他一切,这可能是原因。

在同步用户登录并且您的checkForExistingProfile()变量已初始化之前,您需要执行的操作不是致电self.realmRos。 Cocoa Touch无法自动同步使用异步模式编写的代码(如logIn(),它会立即返回,但会在回调中报告其实际完成状态),因此您需要手动确保所有logIn()是假设的在你调用依赖于完成的任何其他代码之前已经完成了。