Как узнать, что Firebase получил значение - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть три функции getNewOrder(), storeOrderDetails(_ details:[String:String]) и getUserInfo(_ userID:String).

  1. Функция getNewOrder() вызывается первой. Он выбирает новые заказы (значения .childAdded) и отправляет словарь на storeOrderDetails(_ details:[String:String]).
  2. storeOrderDetails (_ подробности: [String: String]) then segregate all the values and calls getUserInfo (_ userID: String) `передав его userID, который присутствовал в его деталях.
  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
}

1 Ответ

0 голосов
/ 30 апреля 2018

Из того, что я вижу здесь, я держу пари, что проблема, с которой вы сталкиваетесь, связана с тем фактом, что методы являются асинхронными. Итак, одна вещь не полностью закончена, а другой метод запускается слишком рано. Есть несколько способов решить эту проблему. Один из них - обработчики завершения, а другой добавляет наблюдателей. Ниже приведен пример выполнения обоих для 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
...