【问题标题】:Firebase load related data iOSFirebase 加载 iOS 相关数据
【发布时间】:2017-11-15 23:48:29
【问题描述】:

在 swift 中加载“相关”数据的最佳方式是什么?

通用设置,如果我有一个用户列表,所有用户都存储在 uid 节点下,并且包含一个存储 uid 的 follows 列表,例如:

"users" : { "abc123" : { "email" : "test@test.com", "follows" : { "xyz789" : true } }, "xyz789" : { ... } }

为一位用户关注的所有用户加载数据的最有效方式是什么?是否最好用observeSingleEvent(of: .value) 循环遍历每个uid

这是我想出的解决方案,但感觉有点麻烦:

func loadRelated(user: User, completion: @escaping (Bool, [UserObject]) -> ()) {

  let ref = Database.database().reference(withPath: "users/" + user.uid + "/follows")
  ref.observeSingleEvent(of: .value) { snapshot in

    var uids = [String]()
    for child in snapshot.children {
      let userData = child as! DataSnapshot
      uids.append(userData.key)
    }

    let userRef = Database.database().reference(withPath: "users")
    var users = [UserObject]()
    var count = 0
    uids.forEach { uid in
      userRef.child(uid).observeSingleEvent(of: .value) { snapshot in
        let user: UserObject(from: snapshot)
        users.append(user)
        count += 1
        if count == uids.count {
          completion(true, users)
        }
      }
    }
  }
}

我真的不想走非规范化路径并将每个用户的数据存储在顶级用户下。

【问题讨论】:

    标签: ios swift firebase


    【解决方案1】:

    如果您决定使用实时数据库,最好在您的案例中创建另一个名为 user-follows 的根节点。您可以通过将值设置为 true 在路径 user-follows/$uid/$fid 处创建关注,然后在您的应用程序上,您必须在 user-follows/$uid 处为每个快照键 ($fid) 设置 observeSingleEvent

    为避免必须单独观察每个关注,而不是将值设置为true,您可以将所需的有关用户的数据存储在user-follows/$uid 中。但是,例如,用户可能会更改他们的用户名,因此您需要使每个 user-follows 中的数据保持最新。当用户更改其信息时,您可以利用 Firebase Cloud Functions 来维护 user-follows

    否则,我建议查看Firebase Firestore,其中允许进行一些嵌套。

    【讨论】:

      【解决方案2】:

      如果您知道您在 /users 的节点将始终包含少数用户,您可以尝试在路径 /users 处使用 observeSingleEvent(of:) 一次获取所有用户>。然后用 ../follows 中的用户过滤用户。 这可能会提取更多数据,但可能会更快(不确定)并且需要更少的代码来处理。

      事实上,您的初始实现已经非常高效了。只需确保正确处理 observeSingleEvent(of:) 的失败,否则条件 count == uids.count 将永远不会满足。

      顺便说一句,将每个用户存储在 ../follows 下只会复制您的数据,并且很难保持更新。所以是的,避免它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2021-11-25
        • 2015-01-03
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        相关资源
        最近更新 更多