我正在研究实现的实时同步,如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))
}
}
}
基本上使用索引传达更改。通过简单地使用这些索引访问底层模型/领域对象,接口已更新。
现在,我有一个与此不兼容的体系结构。我有一个专用的数据库层(其中该领域是一个实现),在该数据库层中,我将Realm对象加载到背景线程中,并将映射到普通的模型对象。这样,我将代码从数据库实现中解脱出来,并可以使用不变的模型。
在这种情况下,我不确定如何处理索引。看来我应该还记得原始查询,再做一次,然后访问我使用这些索引所需的条目?这听起来很低效率...
此外,我不知道这些索引如何与特定查询一起使用,例如"所有具有状态x的项目x" - 我收到的索引是否是指此特定查询?
推荐的方法是什么?
编辑:为了添加一些其他注释,我使用自定义服务器和Websocket实现了自己的同步功能,然后我使用语义键代替索引(有时我什至发送了完整的对象以避免必须查询数据库)。这样,我不得不处理基于索引的访问导致可能的不一致之处。想知道是否可能在某个时候进行类似的事情或与领域同步计划。
P.S。我打算切换到Realm Sync,因为我的自定义服务器的测试不佳,并且很难维护。我希望这是可能的。
所有领域查询返回结果,这是一种自动更新的容器类型,因此您无需再次进行查询。您可以为任何特定的Result
设置通知处理程序,并在更改此集合以更新映射模型时通知。