![](/img/trans.png)
[英]Unable to match child of a child from local storage Firebase RealTime database
[英]Fetching Single Event From a Firebase Realtime Database Child
我在从 Firebase 实时数据库参考中的子节点获取数据时遇到问题。 我正在将作业请求详细信息节点上传到我登录的客户参考,但是当我尝试获取该节点时,我的 controller 不会读取它并将其显示在屏幕上。 是不是因为我必须设置我的 fetch API function 来获取最近通过执行.childAdded
而不是.value
添加的最新作业请求详细信息节点? 或者当我在我的 controller 本身中调用 fetch function 时我做错了什么? 我问的原因是因为我尝试在我的fetchCustomerJobRequest()
中打印 jobRequest 并且它没有打印。 另外,我的var jobReuest: JobRequest?
是因为我第一次通过应用程序在FindEmployeeJobRequestController
中启动它,如果这也是正确的? 先感谢您!
数据库参考设置
作业请求 Model
struct JobRequest {
let uid: String
let fullname: String
let username: String
let address: String
let firstDateAndTimes: String
let secondDateAndTimes: String
let thirdDateAndTimes: String
let timeConstraints: String
let jobDescription: String
init(dictionary: [String : Any]) {
self.uid = dictionary["uid"] as? String ?? ""
self.fullname = dictionary["fullname"] as? String ?? ""
self.username = dictionary["username"] as? String ?? ""
self.address = dictionary["address"] as? String ?? ""
self.firstDateAndTimes = dictionary["firstDateAndTimes"] as? String ?? ""
self.secondDateAndTimes = dictionary["secondDateAndTimes"] as? String ?? ""
self.thirdDateAndTimes = dictionary["thirdDateAndTimes"] as? String ?? ""
self.timeConstraints = dictionary["timeConstraints"] as? String ?? ""
self.jobDescription = dictionary["jobDescription"] as? String ?? ""
}
}
服务 API
struct CustomerService {
static func fetchCustomerJobRequest(completion: @escaping(JobRequest) -> Void) {
guard let uid = Auth.auth().currentUser?.uid else { return }
REF_CUSTOMERS.child(uid).child("job-request-details").childByAutoId().observeSingleEvent(of: .value) { snapshot in
guard let dictionary = snapshot.value as? [String : Any] else { return }
let jobRequest = JobRequest(dictionary: dictionary)
completion(jobRequest)
}
}
}
FindEmployeeJobRequestController
// MARK: - Properties
var jobRequest: JobRequest? {
didSet {
configure()
}
}
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
fetchCustomerJobRequest()
}
// MARK: - API
func fetchCustomerJobRequest() {
CustomerService.fetchCustomerJobRequest { jobRequest in
self.jobRequest = jobRequest
}
}
// MARK: - Helper Functions
fileprivate func configure() {
guard let jobRequest = jobRequest else { return }
let viewModel = JobRequestViewModel(jobRequest: jobRequest)
fullnameDetailsLabel.text = viewModel.fullname
usernameDetailsLabel.text = "@" + viewModel.username
addressDetailsLabel.text = viewModel.address
firstDateAndTimeDetailsLabel.text = viewModel.firstDateAndTimes
secondDateAndTimeDetailsLabel.text = viewModel.secondDateAndTimes
thirdDateAndTimeDetailsLabel.text = viewModel.thirdDateAndTimes
timeConstraintsDetailsLabel.text = viewModel.timeConstraints
jobDescriptionDetailsLabel.text = viewModel.jobDescription
}
此代码不符合您的预期:
REF_CUSTOMERS.child(uid).child("job-request-details").childByAutoId().observeSingleEvent(of: .value)
调用childByAutoId()
它会生成一个新的唯一位置,然后您可以在该位置上调用observeSingleEvent
。 但是由于您没有向该位置写入任何内容,因此侦听器将永远不会获得任何价值。
因此,回调中的snapshot.value
将为nil
,实际上snapshot.exists()
将为false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.