1

我正在研究 Realm 的“任务”示例应用程序中实现的实时同步。

特别是,这个块:

private func setupNotifications() -> NotificationToken {
    return parent.items.addNotificationBlock { [unowned self] changes in
        switch changes {
        case .Initial:
            // Results are now populated and can be accessed without blocking the UI
            self.viewController.didUpdateList(reload: true)
        case .Update(_, let deletions, let insertions, let modifications):
            // Query results have changed, so apply them to the UITableView
            self.viewController.tableView.beginUpdates()
            self.viewController.tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic)
            self.viewController.tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic)
            self.viewController.tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .None)
            self.viewController.tableView.endUpdates()
            self.viewController.didUpdateList(reload: false)
        case .Error(let error):
            // An error occurred while opening the Realm file on the background worker thread
            fatalError(String(error))
        }
    }
}

基本上,更改是使用索引来传达的。通过使用这些索引简单地访问底层模型/领域对象,接口被更新。

现在我有一个似乎与此不兼容的架构。我有一个专用的数据库层(其中领域是一个实现),我在后台线程中加载领域对象并映射到普通模型对象。这样我就可以将我的代码与数据库实现分离,并且可以使用不可变模型。

在这种情况下,我不确定如何处理索引。看起来我应该记住原始查询,再做一次,然后使用这些索引访问我需要的条目?听起来效率很低……

此外,我不知道索引如何与特定查询一起使用,例如“所有在字段 y 中具有状态 x 的项目”——我收到的索引是否指的是这个特定查询?

在这里进行的推荐方式是什么?

编辑:只是为了添加一些额外的评论,我使用自定义服务器和 websockets 实现了自己的同步功能,并且我使用语义键而不是索引(有时我什至发送了完整的对象以避免查询数据库)。这样我就不必处理基于索引的访问可能导致的不一致。想知道类似的事情是否可能或计划在某个时候使用 Realm 同步。

PS 我打算切换到 Realm 同步,因为我的自定义服务器没有经过很好的测试并且很难维护。我希望这是可能的。

4

1 回答 1

1

所有领域查询都返回Results,它是一种自动更新的容器类型,因此您无需再次进行查询。您可以为任何特定设置通知处理程序Result,并在更改此集合以更新映射模型时收到通知。

于 2016-12-05T10:18:58.940 回答