是否可以在没有索引的情况下使用 Realm 对象服务器实时同步?
Is it possible to use Realm object server real time sync without indices?
我正在研究 Realm 的 "tasks" 示例应用程序中实现的实时同步。
特别是这个区块:
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: [=10=], inSection: 0) }, withRowAnimation: .Automatic)
self.viewController.tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: [=10=], inSection: 0) }, withRowAnimation: .Automatic)
self.viewController.tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: [=10=], 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))
}
}
}
基本上,更改是使用索引来传达的。通过简单地使用这些索引访问底层模型/领域对象,界面就会更新。
现在我的架构似乎与此不兼容。我有一个专用的数据库层(其中领域是一个实现),我在后台线程中加载领域对象并映射到普通模型对象。这样我就可以将我的代码与数据库实现分离,并且可以使用不可变模型。
我不确定在这种情况下如何处理索引。看起来我应该记住原始查询,再做一次,然后使用这些索引访问我需要的条目?听起来效率很低...
此外,我不知道索引如何与特定查询一起工作,例如 "all items that have status x in field y" - 我收到的索引是指这个特定查询吗?
此处推荐的操作方式是什么?
编辑:只是为了添加一些额外的评论,我使用自定义服务器和 websockets 实现了自己的同步功能,并且我使用语义键而不是索引(有时我什至发送完整的对象以避免查询数据库) .这样我就不必处理基于索引的访问可能导致的不一致。想知道这样的事情是否可能或计划在某个时候与 Realm 同步。
P.S。我打算切换到 Realm sync,因为我的自定义服务器没有经过很好的测试并且很难维护。我希望这是可能的。
所有领域查询 return Results, it's an auto-updating container type, so you don't need to make the query again. You can setup the notification handler 任何特定 Result
并在更改此集合以更新您的映射模型时收到通知。
我正在研究 Realm 的 "tasks" 示例应用程序中实现的实时同步。
特别是这个区块:
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: [=10=], inSection: 0) }, withRowAnimation: .Automatic)
self.viewController.tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: [=10=], inSection: 0) }, withRowAnimation: .Automatic)
self.viewController.tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: [=10=], 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))
}
}
}
基本上,更改是使用索引来传达的。通过简单地使用这些索引访问底层模型/领域对象,界面就会更新。
现在我的架构似乎与此不兼容。我有一个专用的数据库层(其中领域是一个实现),我在后台线程中加载领域对象并映射到普通模型对象。这样我就可以将我的代码与数据库实现分离,并且可以使用不可变模型。
我不确定在这种情况下如何处理索引。看起来我应该记住原始查询,再做一次,然后使用这些索引访问我需要的条目?听起来效率很低...
此外,我不知道索引如何与特定查询一起工作,例如 "all items that have status x in field y" - 我收到的索引是指这个特定查询吗?
此处推荐的操作方式是什么?
编辑:只是为了添加一些额外的评论,我使用自定义服务器和 websockets 实现了自己的同步功能,并且我使用语义键而不是索引(有时我什至发送完整的对象以避免查询数据库) .这样我就不必处理基于索引的访问可能导致的不一致。想知道这样的事情是否可能或计划在某个时候与 Realm 同步。
P.S。我打算切换到 Realm sync,因为我的自定义服务器没有经过很好的测试并且很难维护。我希望这是可能的。
所有领域查询 return Results, it's an auto-updating container type, so you don't need to make the query again. You can setup the notification handler 任何特定 Result
并在更改此集合以更新您的映射模型时收到通知。