Ios 访问Firebase数据库中的多个节点

Ios 访问Firebase数据库中的多个节点,ios,arrays,swift,firebase-realtime-database,struct,Ios,Arrays,Swift,Firebase Realtime Database,Struct,我很难从firebase数据库中的一个节点提取所有数据 以下是Firebase中节点的外观: Considerations -MEdUNZwVrsDW3dTrE6N Company Description: Company Image: Company Name: Decision Date: Start Date: Users B2Z4DlZ8RucvEQh

我很难从firebase数据库中的一个节点提取所有数据

以下是Firebase中节点的外观:

Considerations
     -MEdUNZwVrsDW3dTrE6N
        Company Description: 
        Company Image: 
        Company Name: 
        Decision Date: 
        Start Date: 
        Users
           B2Z4DlZ8RucvEQhz2NSUkquqc5P2
              Compensation: 
              PostNumber: 
              StoryNumber:
在“用户”下,将有多个具有不同补偿值、帖子编号和故事编号的人。我让每个用户都有一个名为“用户注意事项”的节点,该节点标记每个用户所附加注意事项的唯一id,并将其放在其UID下,并在其旁边标记1作为值。我试图访问每个特定用户的信息以及节点中的其他信息。下面是我用来调用信息的代码以及用来捕获信息的结构:

结构:

import UIKit

class ConsiderationInfo: NSObject {
    var companyName: String?
    var companyImage: String?
    var companyDescription: String?
    var decisionDate: String?
    var startDate: String?
    var compensation: String?
    var postNumber: String?
    var storyNumber: String?
}
观察信息代码:

 func updateConsiderationsArray() {
    
    let uid = Auth.auth().currentUser?.uid
    let ref = Database.database().reference().child("user-considerations").child(uid!)
            
            ref.observe(.childAdded, with: { (snapshot) in
            
                    let considerationId = snapshot.key
                    let considerationReference = Database.database().reference().child("Considerations").child(considerationId)
            
                    considerationReference.observe(.value, with: { (snapshot) in

                    if let dictionary = snapshot.value as? [String: AnyObject] {
                    let considerationInfo = ConsiderationInfo()
                    //self.setValuesForKeys(dictionary)
                    considerationInfo.companyName = dictionary["Company Name"] as? String
                    considerationInfo.companyImage = dictionary["Company Image"] as? String
                    considerationInfo.companyDescription = dictionary["Company Description"] as? String
                    considerationInfo.decisionDate = dictionary["Decision Date"] as? String
                    considerationInfo.startDate = dictionary["Start Date"] as? String
                
                    self.considerationsInfo.append(considerationInfo)
                    self.considerationName.append(considerationInfo.companyName!)
                    self.filteredConsiderations.append(considerationInfo.companyName!)
                        
                        self.considerationCollectionView.reloadData()
                }
            }, withCancel: nil)
        })
    }
我正在尝试访问用户特定节点下的信息,即特定用户的薪酬职位编号和故事编号。我不知道如何访问所有这些来附加结构

以下是包含用户注意事项的节点:


就目前的情况来看,我真的没有看到代码有什么超级错误,但可以对代码进行更改以使其更加精简

我会首先更改考虑信息类,使其更加独立。添加一个方便的初始值设定项,通过一些错误检查直接处理firebase快照

class ConsiderationInfo: NSObject {
    var companyName = ""

    convenience init(withSnapshot: DataSnapshot) {
        self.init()
        self.companyName = withSnapshot.childSnapshot(forPath: "Company Name").value as? String ?? "No Company Name"
    }
}
我还建议删除.childAdded和.observe事件,除非您特别希望收到有关未来更改的通知。改为使用.value和.observeSingleEvent。请记住,.childAdded一次遍历数据库中的每个节点-.value同时读取所有节点。如果数据量有限,.value可以正常工作

    func updateConsiderationsArray() {
        let fbRef = Database.database().reference()
        let uid = Auth.auth().currentUser?.uid
        let ref = fbRef.child("user_considerations").child(uid)
        ref.observeSingleEvent(of: .value, with: { snapshot in
            let allUidsSnap = snapshot.children.allObjects as! [DataSnapshot]
            for uidSnap in allUidsSnap {
                let considerationId = uidSnap.key
                let considerationReference = fbRef.child("Considerations").child(considerationId)
                considerationReference.observeSingleEvent(of: .value, with: { snapshot in
                    let considerationInfo = ConsiderationInfo(withSnapshot: snapshot)
                    self.considerationArray.append(considerationInfo)
                    // update your collectionView
                })
            }
        })
    }
我在上面所做的是从用户的考虑中读入单个节点,根据您的问题看起来是这样的

user_considerations
   some_user_uid
      a_user_uid
      a_user_uid
然后将每个子用户映射到一个数组以维护顺序

let allUidsSnap = snapshot.children.allObjects as! [DataSnapshot]

然后对每个节点进行迭代,获取每个节点的uid(键)并从“注意事项”节点获取该节点的数据。

代码格式不好,难以读取,您可以修复此问题。此外,请遵守编码标准。类和结构名称是大写的第一个字符。变量是小写的第一个字符。还有,为什么要反对?这是斯威夫特。另外,使用cancel后的
代码是怎么回事,因为它什么也不做。您不需要这个
DispatchQueue.main.async{
在firebase闭包中,UI调用始终在主线程上完成。为什么要在所有这些节点上留下观察者-在数据库中做一个更改,然后在已有的基础上重新加载所有内容。请参见
。observeSingleEvent
嘿,Jay。谢谢你的帮助。就像我提到的,我对编码是新手(我从未上过编码课)因此,我不知道某些协议使用大写字母和NSObject。我试图通过读取特定的公司节点来设置类考虑中的所有字符串。我进行了一次编辑,显示了我如何设置一个名为“用户考虑”的节点,该节点在每个用户的uidIt下用一个uid标记公司的考虑uid包含你的结构,但如果可能的话,将其作为文本包含-这样我们可以复制并粘贴到答案中,而不是重新键入。很明显,结构的这一部分是什么,但感谢你包含它。如果你能解决我提到的其余问题,它将有所帮助;修复你的变量,格式化问题中的代码并删除/update多余的代码。这太难阅读了,我们仍然不知道问题底部的代码是怎么回事。请记住,该值会在任何时候发生更改时引发事件,并添加到现有数据或覆盖现有数据。嘿,Jay。我删除了重新加载数据,它不会加载集合视图。我将变量改为小写,然后删除了ed在withCancel之后进行了第二次观察。我还需要做什么才能帮助我?我没有说要删除重新加载数据。请重新阅读以上所有评论。编码是一项非常精确的规则,匆忙完成任务和忽略要点只会导致长期的头痛。请放慢速度并更正项目中的实际代码,n不要只更新问题中的代码;是的,您将属性小写,但现在您的其余代码将不起作用
considerationInfo.CompanyName
。我们仍然不知道使用取消
后的代码是用于什么。我们还知道这意味着它会删除其他节点信息吗?删除什么?Firebase?其他什么?嘿,Jay.Tha谢谢你的帮助。我能读写考虑节点中的信息和每个用户的用户特定信息吗?@CoderCoop答案中的解释不清楚吗?代码在用户考虑中迭代子注释,获取每个用户id,然后从考虑中读取这些特定节点-这就是为什么你不想,对吗?我没有解决任何数据写入问题,因为这不是问题的一部分。这是我在问题中没有明确说明自己的错误。我希望能够阅读“考虑”节点中的每一项内容以及当前特定于用户的信息。例如,我希望每个用户都能够阅读公司描述:Company图像:公司名称:决策日期:开始日期:但根据用户的不同,他们也可以读取自己的特定信息,即能够观察多个节点。@CoderCoop我回答中的代码可以用于这两项任务。我建议按原样执行,以读取多个节点(根据您的问题)然后修改为只读取单个特定用户节点,而不是将它们全部加载到数组中。很遗憾,我需要一个数组,因为我正在使用数组计数填充集合视图项目计数。集合视图将包含所有注意事项,并使用存储在我的firebase存储中的公司映像作为其项目映像.当使用考虑因素时,会将他们带到一个v