Ios 访问Firebase数据库中的多个节点
我很难从firebase数据库中的一个节点提取所有数据 以下是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
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