如何知道Firebase是否已获取值

时间:2018-04-27 20:57:51

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

我有三个功能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 calls getUserInfo(_ userID:String)`通过传递其详细信息中的userID。
  3. getUserInfo(_ userID:String)然后提取用户详细信息并返回用户 信息。
  4. 然而,问题是userInfo = getUserInfo(_ userID:String)中的{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
    }
    

1 个答案:

答案 0 :(得分:0)

从我在这里看到的,我打赌你面临的问题与方法是异步的事实有关。所以有一件事没有完全完成,其他一些方法很快就被解雇了。有几种方法可以解决这个问题。一个是完成处理程序,另一个是添加观察者。以下是为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