【问题标题】:Synced Realm not being loaded on launch启动时未加载同步领域
【发布时间】:2016-10-19 03:12:38
【问题描述】:

我正在尝试在我的 ios 应用程序中使用 Realm Object Server。我将它托管在 AWS 上,我可以成功地对其进行读写。但是,我在启动我的应用程序后访问同步领域时遇到问题。在启动时,我有一个登录视图控制器(与示例应用程序中提供的非常相似)

身份验证成功后,我想访问同步的 Realm 来决定要呈现哪个视图控制器。

@IBAction func logIn(sender: AnyObject?) {
    guard userInputValid() else {
        return
    }
    self.activityIndicator.startAnimating()
    self.logInButton.isHidden = true
    SyncUser.authenticate(with: Credential.usernamePassword(username: userNameTextField.text!, password: passwordTextField.text!, actions: []), server: syncAuthURL!, onCompletion: { user, error in
        guard let user = user else {
            self.presentError(error: error as! NSError)
            self.activityIndicator.stopAnimating()
            self.logInButton.isHidden = false
            return
        }

        Realm.Configuration.defaultConfiguration = Realm.Configuration(
            syncConfiguration: (user, self.syncServerURL!),
            objectTypes: [Dot.self, Mod.self]
        )

        let realm = try! Realm()
        // realm.objects(Dot.self).count == 0 here even though there is a Dot object persisted in the server
        // When I access the realm later in the app (e.g in a viewDidAppear of another controller) the object is there
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let vc = DotCollectionViewController(nibName: "DotCollectionViewController", bundle: nil)
        let navVC = UINavigationController(rootViewController: vc)
        appDelegate.window?.rootViewController = navVC
    })
}

我已经验证了对同步领域的读写,并发现了一些奇怪的东西:即使我能够成功写入数据,领域似乎也有一个 null 的 fileURL。我正在使用let realm = try! Realm() 访问我应用程序其他部分中的领域,而当我使用print(realm.configuration.fileURL) 时,我总是得到零,即使对于有效的同步领域也是如此。

所以我的问题是,我是否必须等待一段时间才能访问同步的领域?如果是这样,我将如何去做?对此问题的任何帮助将不胜感激。

【问题讨论】:

    标签: ios database swift realm


    【解决方案1】:

    预计同步 Realm 配置的 fileURLnil,因为文件位置由我的 Realm 管理,用户(您)无法访问。

    当第一次在设备上打开一个同步的领域时,只要存在有效的SyncUser,该领域就可以访问,由SyncUser.authenticate(...)回调提供。但是,它的内容会被异步填充,这就是为什么realm.objects(Dot.self)在立即打开Realm时为空,但稍后从服务器获取对象。

    如果在继续处理应用程序的一部分之前等待数据可用很重要,Realm 将在不久的将来通过两种方式来做到这一点:

    【讨论】:

    • 感谢您的回复。所以在我的应用程序中,我正在加载一个基于同步领域的集合视图。在加载之前等待填充领域的最佳方法是什么?我可以使用Thread.sleep(),但这显然是一种黑客攻击。我也不想让计时器任务不断检查 UI 更新。
    • 您应该使用集合通知来了解更改何时到来,无论是来自同步、其他进程还是其他线程。
    • 您能否解释一下收藏通知的含义?
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多