Parse が閉鎖されたので、Firebase をメインの BaaS として使い始めたいと考えています。現時点では、Firebase のリアルタイム機能は興味深いものであり、将来的にはそれらを使用する予定ですが、現時点では主に、ユーザーと関連データを保存する方法として Firebase を使用したいと考えています。Parse を使用すると、関連付けられたユーザーをオブジェクトに関連付けてオブジェクトをアップロードするだけで済み、これは非常に簡単でした。次に、そのユーザーに関連付けられたオブジェクトでフィルター処理できます。
ただし、Firebase ではすべてがオンデマンドではなくイベント ドリブンであり、セキュリティ ルールでフィルタリングすることはできません。一般的に、私はこのアプローチが好きですが、今日必要なものに適用するのに苦労しています. 私はネットワーキング/データベースのバックグラウンドをあまり持っていないので、これらのいくつかは本当に基本的なものである可能性があります.
これが私がやろうとしていることです:
現在、Firebase のデータ構造は次のようになっています。
xnterval
users
100b920f-d2c5-4578-9f49-ecf38ef71302
32a8dbf2-009a-44c5-a188-ca2c280ba135
d53b0b37-d773-4cf5-af94-74635fc76f1f
name: "Joe Schmo"
provider: "password"
username: "jschmo"
workouts
-K9wZ4_Rt-xBdVZt93d4
workout_id: "-K9wZ4_Rt-xBdVZt93d3"
workouts
-K9wZ4_Rt-xBdVZt93d3
interval_period: 180
intervals: 2
name: "Workout"
owner: "d53b0b37-d773-4cf5-af94-74635fc76f1f"
rest_period: 150
work_period: 30
User/"uid" 内には、childByAutoId で並べられたワークアウト リストがあり、単一のワークアウトの ID が含まれています。
私ができるようにしたいのは、すべてのユーザーのワークアウトのリストを取得し、ワークアウト セクションからその完全なワークアウト リストを取得することです。
ユーザーのワークアウト root/"uid"/workouts への直接の PATH はわかっていますが、リスト全体を取得して各 "workout_id" を取得し、続いて /workouts セクションでワークアウトのリストを照会するにはどうすればよいでしょうか?
また、他のユーザーが別のユーザーのデータにアクセスできないように、セキュリティ ルールを既に設定してあります。また、ワークアウトの所有者が認証されたユーザーの UID である場合にのみ、ワークアウトの読み取り/書き込みを行うことができます。これは正しく機能しています。
たぶん、私はこれを間違った方法で行っているか、データを構造化して目的を達成するためのより簡単な方法があります。クエリで必要な転送量を最適化するためにデータの非正規化に関する記事をいくつか読みましたが、将来に向けて構築するには、このデータ構造が理想的だと思います。でも、もっと経験があれば教えてください。ありがとう!
アップデート
そこで、すべてのユーザーのワークアウト ID を取得し、それらを配列 userWorkoutIds に格納するこのメソッドを作成しました。
private func observeAllUserWorkouts() {
if userAuthData != nil {
workoutObserver = userRef?.childByAppendingPath("workouts").observeEventType(FEventType.Value, withBlock: { snapshot in
let enumerator = snapshot.children
while let child = enumerator.nextObject() as? FDataSnapshot {
NSLog("\(child.childSnapshotForPath("workout_id").value)")
self.userWorkoutIds?.append(child.childSnapshotForPath("workout_id").value as! String)
}
})
}
}
すべてのユーザー ワークアウト /workouts/"ID" のパスが正確にわかったので、すべてのパスに対してシングル ショット オブザーバーを設定するのではなく、一度にすべてをポーリングするにはどうすればよいでしょうか? またはそれが唯一のオプションですか?