繁体   English   中英

从 Firebase 实时数据库子项中获取单个事件

[英]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.

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