繁体   English   中英

Swift -Firebase 从 snapshot.children 的子集中获取最后一个 childKey

[英]Swift -Firebase get last childKey from a subset of snapshot.children

如何从子键的子集中获取最后一个子键? 例如。 在循环中,我想在getLastChildKey()函数中获取Lqouwhrbcausobc8abcLkasjhvbafoshvb8xyz

D b:

messageIds-userIds
    |
    @--currentUserId
           |
           @--XcAUw75y6vXBxCiNl3flrl9qcztob 
           |      |-Laouhfbobhvahsblask : 1
           |      |-Lwbiuwripibpiwbjvcp : 1
           |      |-Lqouwhrbcausobc8abc : 1  // I want to grab this messageId
           |
           @--ZBBglasjdbvj2X8zbMwasdbpBzOOp21w
                  |-Laofbhaphvbapsjvbpa : 1
                  |-Lljafhbvpojhfbvaljk : 1
                  |-Lkasjhvbafoshvb8xyz : 1  // I want to grab this messageId

代码:

let ref = Database.database().reference().child(messageIds-userIds)

ref.child(currentUserId)
   .queryOrderedByKey()
   .queryLimited(toLast: 20)
   .observe( .value, with: { (snapshot) in

       for child in snapshot.children.allObjects as! [DataSnapshot] {

           let userId = child.key

           self.getLastChildKey(from: userId, childSnapshot: child)
       }
})

func getLastChildKey(from userId: String, childSnapshot: DataSnapshot) {

    for child in childSnapshot.children {
            
        let snap = child as! DataSnapshot
            
    }
}

无法通过单个读取操作从每个子节点中仅获取最后一个子节点。 虽然可以获得节点的最后一个子节点,但在这种情况下,您必须知道父节点的完整路径。

这归结为 Firebase 实时数据库查询对子节点列表而不是树进行操作的事实。

  • 因此,您只能请求messageIds-userIds的最后一个(或第一个)子节点,因为您知道该messageIds-userIds节点的完整路径。

  • 如果您知道currentUserId那么您也可以请求该节点的第一个/最后一个子节点。

  • 如果您知道currentUserIdXcAUw75y6vXBxCiNl3flrl9qcztob ,那么您也可以请求该节点的第一个/最后一个子节点。

但是,如果您只知道messageIds-userIds并且想要获取其每个currentUserId/$XcAUw75y6vXBxCiNl3flrl9qcztob子节点的最后一个子节点,则需要像现在一样阅读整个结构。


它通常有助于为您的应用程序的用例建模数据。 在这种情况下,考虑将每个路径的最后一个子节点存储在单个列表中。

lastChildNodes: {
    "currentUserId XcAUw75y6vXBxCiNl3flrl9qcztob": "-Lqouwhrbcausobc8abc"
    "currentUserId ZBBglasjdbvj2X8zbMwasdbpBzOOp21w": "-Lkasjhvbafoshvb8xyz"
}

代码示例:

func getLastChildKey(from userId: String, childSnapshot: DataSnapshot) {
    DataSnapshot last = nil
    for child in childSnapshot.children {            
        snap = child as! DataSnapshot            
    }
    return snap
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM