Firebase快照转NSDictionary后顺序变更及最后ID获取咨询
如何保持Firebase查询结果的顺序并获取最后一个ID
你碰到的问题其实是因为allValues返回的是无序字典——不管是Swift的Dictionary还是Objective-C的NSDictionary,本身都不保证元素的排列顺序,所以转成NSArray后自然会打乱Firebase查询返回的有序结果。但别担心,Firebase的DataSnapshot已经帮你维护好了正确的顺序,只是你用错了获取数据的方式。
核心解决方案:遍历children属性获取有序数据
Firebase查询返回的DataSnapshot里,children属性是一个严格遵循你查询规则(queryOrderedByKey() + queryLimited(toLast:5))的有序集合。你可以直接遍历它来保持顺序,或者直接取最后一个子快照拿到目标ID。
代码示例:获取最后一个ID
self.getReferencePath().child(User.followingReferencePath) .queryOrderedByKey() .queryLimited(toLast: 5) .observeSingleEvent(of: .value) { snapshot in // 直接获取最后一个子快照 if let lastChild = snapshot.children.allObjects.last as? DataSnapshot { // 提取debate_id let lastDebateId = lastChild.childSnapshot(forPath: "debate_id").value as? String print("最后一个debate_id:\(lastDebateId ?? "获取失败")") // 在这里用lastDebateId执行你的后续查询 } }
如果你需要有序的完整数组
如果后续需要用到所有5条有序数据,不要用allValues,而是手动遍历children来构建数组:
self.getReferencePath().child(User.followingReferencePath) .queryOrderedByKey() .queryLimited(toLast: 5) .observeSingleEvent(of: .value) { snapshot in var orderedDebates: [[String: Any]] = [] for child in snapshot.children { guard let childSnapshot = child as? DataSnapshot, let debateDict = childSnapshot.value as? [String: Any] else { continue } orderedDebates.append(debateDict) } // orderedDebates就是严格按查询顺序排列的数组 print("有序结果:\(orderedDebates)") }
为什么之前的方法会乱序?
allValues本质是把快照里的所有键值对转成字典,而字典的存储是无序的(即使打印时看起来有顺序,那也只是系统的随机排列,不保证和查询顺序一致)。所以只要你用了allValues转数组,顺序必然会被打乱。
内容的提问来源于stack exchange,提问作者Mohanraj
相关产品推荐
相关产品推荐

