Realmの "tasks"サンプルアプリケーションで実装されているリアルタイム同期を調べていました。特にインデックスなしで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を持つすべてのアイテム」のような特定のクエリでインデックスがどのように機能するのかわかりません。
ここに進むにはどのような方法が良いですか?
編集:追加の解説を追加するだけで、カスタムサーバーとWebソケットを使用して同期機能を実装しました。指標の代わりにセマンティックキーを使用しました(データベース全体を照会することを避けるために完全なオブジェクトを送信する場合もあります)。このようにして、インデックスベースのアクセスに起因する可能性のある矛盾を処理してはいけませんでした。そのようなことが可能であるかRealmの同期を計画していることがあるのかどうか疑問に思う。
P.S.カスタムサーバーは十分にテストされておらず、維持が非常に難しいため、Realmの同期に切り替えるつもりです。私はこれが可能であることを願っています。
推奨する方法は、すべてをマップするのではなく、ゼロコピーデータベースをゼロコピーデータベースとして使用することですが、詳細については、[公式ドキュメント](https://realm.io/)を参照してください。 docs/swift/latest /#queries) – EpicPandaForce
DBの実装からインタフェースコードを分離することは、まず最初に領域への切り替えを可能にしました。もちろん、それには欠点があります。私はそれを認識しています。 – Ixx