2016-12-04 3 views
1

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の同期に切り替えるつもりです。私はこれが可能であることを願っています。

+0

推奨する方法は、すべてをマップするのではなく、ゼロコピーデータベースをゼロコピーデータベースとして使用することですが、詳細については、[公式ドキュメント](https://realm.io/)を参照してください。 docs/swift/latest /#queries) – EpicPandaForce

+0

DBの実装からインタフェースコードを分離することは、まず最初に領域への切り替えを可能にしました。もちろん、それには欠点があります。私はそれを認識しています。 – Ixx

答えて

1

すべてのrealmクエリーはResultsを返します。これはauto-updatingコンテナタイプなので、クエリーをもう一度行う必要はありません。特定のResultnotification handlerを設定して、このコレクションがマップされたモデルを更新するように変更されたときに通知を受けることができます。

+0

これは私のアーキテクチャが反応しないので難しいでしょう。私はコールバックを介してデータを取得するステートレスプロバイダを使用しています。何かを考えなければならないでしょう、おそらく私はコントローラで 'Result'を使って直接終了します。 いくつかのフィルタ/述語を含むクエリがある場合、私が受け取るインデックスはこの特定の結果を参照している、つまりすべてのフィルタを含んでいますか? – Ixx

+1

@ lxxはい、そうです。 – Dmitry

関連する問題