【问题标题】:How to know if a Firebase has fetched a value如何知道 Firebase 是否已获取值
【发布时间】:2018-10-08 18:15:15
【问题描述】:

我有三个函数getNewOrder()storeOrderDetails(_ details:[String:String])getUserInfo(_ userID:String)

  1. 函数getNewOrder()首先被调用。它获取新订单(.childAdded 值)并将字典发送到storeOrderDetails(_ details:[String:String])
  2. storeOrderDetails(_ details:[String:String])then segregate all the values and callsgetUserInfo(_ userID:String)` 传递其详细信息中存在的用户 ID。
  3. getUserInfo(_ userID:String) 然后获取用户详细信息并返回用户的 信息。

但是,问题是 [userInfo = getUserInfo(_ userID:String) in storeOrderDetails(_ details:[String:String])] userInfo 始终为空。显然func getUserInfo(_ userID:String) 在返回空值后进入完成块。

我希望这三个函数按顺序执行。 非常感谢任何建议。

请按照以下链接查看我的代码。 https://imgur.com/hNjvyDk https://imgur.com/J0LMXMg

 func childAdded(){
    let ref = Database.database().reference().child("Orders").child(todaysDate)
        ref.observe(.childAdded) { (snapshot) in
        var details = [String:String]()
       if let orderID = snapshot.key as? String {
               ref.child(orderID).observeSingleEvent(of: .value, with: { (snap) in
                        self.newOrderTextView.text = ""
                        self.customerNameLabel.text = ""
                        self.customerPhoneLabel.text = ""
                        self.orderNumberLabel.text = ""

                        let enumerator = snap.children
                        while let rest = enumerator.nextObject() as? DataSnapshot {
                        details[rest.key as? String ?? ""] = rest.value as? String ?? ""
                        }
                        self.storeUserDetails(details)
             })
        }
    }
}




func storeUserDetails(_ details:[String:String]){
    if details["CustomerID"]  != nil {
        userInfo = getUserDetails(details["CustomerID"]!)
        print(userInfo)

    }
        if !userInfo.isEmpty{
            let order = OrderDatabase()
        order.customerEmail = userInfo["Email"]!
        order.customerName =  userInfo["Name"]!
        order.orderAcceptStatus = details["OrderStatus"]!
        order.customerOrderNumber = details["orderNumber"]!
        order.orderID = details["orderID"]!
        order.time = details["Time"]!
        order.customerFirebaseID = details["CustomerID"]!
       self.orderDatabase[details["orderNumber"]!] = order
       self.orderTable.reloadData()

    }

}




func getUserDetails(_ userID:String) -> [String:String]{

     var details = [String:String]()
   let userDetailsReference = Database.database().reference().child("Users")
    userDetailsReference.child(userID).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in



        if let dictionary = snapshot.value as? NSDictionary {
            self.customerNameLabel.text = dictionary.value(forKey: "Name") as? String
            self.customerPhoneLabel.text = dictionary.value(forKey: "Email") as? String

            details["Name"] = dictionary.value(forKey: "Name") as? String
            details["Email"] =  dictionary.value(forKey: "Email") as? String

        }

    })

return details
}

【问题讨论】:

  • 您能否编辑您的代码以将功能显示为一个整体,以便我们更好地为您提供帮助。
  • 您需要将代码放在这里,而不是代码图片的链接。不看代码很难理解你的确切问题
  • 对不起,这里的代码没有对齐我试图发布它,但由于某种原因,一半的代码格式正确,其余代码在单行中。对于给您带来的不便,我深表歉意。
  • 如果您使用的是 XCode,您可以将文本移至左边距,复制并粘贴到您的问题中。然后选择问题中的文本并使用 {} 代码格式化括号将其格式化为代码。投票结束,因为没有代码问题没有上下文,任何答案都只是猜测。如果您可以包含代码,我敢打赌我们可以回答。

标签: ios swift firebase firebase-realtime-database swift3


【解决方案1】:

从我在这里看到的情况来看,我敢打赌,您面临的问题与方法是异步的这一事实有关。所以一件事还没有完全完成,而其他一些方法过早地被解雇了。有几种方法可以处理这个问题。一个是完成处理程序,另一个是添加观察者。下面是一个为 Firebase 做这两个的例子。在这里,我要求使用 getLocationPhotos 方法从 Firebase 获取所有照片。注意观察者和完成处理程序

func getLocationPhotos(coordinate:CLLocationCoordinate2D){
    dbHandler.getImageFileNames(coordinateIn: coordinate) { (filenames) in

        if filenames.isEmpty {
            log.debug(String.warningGet + "filenames is empty")
            return
        }//if filenames.isEmpty

        self.imageFiles = filenames.filter { $0 != "none" }

        if self.imageFiles.isEmpty {
            log.error(String.errorGet + "imageFiles array is empty")
            return
        }//if imageFiles.isEmpty

        for file in self.imageFiles {
            let reference = self.storageHandler.imageReference.child(file)

            let download = self.imageView.sd_setImage(with: reference)

            if let i = self.imageView.image {
                        self.imageArray.append(i)
                        self.collectionView.reloadData()
                    }//let i

                download?.observe(.progress, handler: { (snapshot) in
                        guard let p = snapshot.progress else {
                            return
                        }//let p
                    self.progressView.progress = Float(p.fractionCompleted)
                    if self.progressView.progress == Float(1) {
                        self.progressView.isHidden = true
                    }
                    })//progress

                download?.observe(.success, handler: { (snapshot) in
                        self.progressView.progress = 1
                        self.progressView.isHidden = true
                        self.collectionView.setNeedsLayout()
                    })//success

                download?.observe(.failure, handler: { (snapshot) in
                        log.error(String.errorGet + "Error occured getting data from snapshot")
                    })//failure
    }//for file
}//dbHandler

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2021-10-07
    • 2021-06-22
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多