为什么从数据库中提取信息的功能不能正常工作?

时间:2019-09-22 21:21:42

标签: ios swift firebase firebase-realtime-database

我正在尝试从Firebase数据库中提取数据列表。下面是我的代码。在我的viewDidLoad();中都调用了这两个函数,但是即使我的数据库已完全填充,print(theLikeArray)仍返回空括号。

以下是我当前正在使用的代码。第一个函数用于从数据库检索所有信息,而第二个函数用于填充数据库。第二个函数在第一个函数之前被调用。

func retriveDiscounts() {
    let likesDB = Database.database().reference().child("Discounts")
    likesDB.observe(.childAdded) { (snapshot) in
        let snapshotValue = snapshot.value as! Dictionary<String , String>
        let businessID = Int(snapshotValue["BusinessID"]!)
        let businessName = snapshotValue["businessName"]!
        let DateNumber = Int(snapshotValue["DateNumber"]!)
        let theDeal = snapshotValue["theDeal"]!
        let phoneNumber = snapshotValue["PhoneNumberText"]!
        let imageName = snapshotValue["ImageName"]!
        let dateText = snapshotValue["DateText"]!
        let phoneNumberInteger = Int(snapshotValue["phoneNumberInteger"]!)
        let companyLogo = snapshotValue["companyLogo"]!
        let r1 = Int(snapshotValue["r1"]!)
        let r2 = Int(snapshotValue["r2"]!)
        let r3 = Int(snapshotValue["r3"]!)
        let classification = snapshotValue["classification"]!
        let allTheLikes = likeclass()
        allTheLikes.discountID = businessID!
        allTheLikes.businessName = businessName
        allTheLikes.dateApplied = DateNumber!
        allTheLikes.theDeal = theDeal
        allTheLikes.phoneNumber = phoneNumber
        allTheLikes.imageName = imageName
        allTheLikes.dateText = dateText
        allTheLikes.numberNumber = phoneNumberInteger!
        allTheLikes.companylogo = companyLogo
        allTheLikes.r1 = r1!
        allTheLikes.r2 = r2!
        allTheLikes.r3 = r3!
        allTheLikes.classification = classification
        self.theLikeArray.append(allTheLikes)
    }
    print(theLikeArray)
}



func updateLikeDatabase(){
    for i in 0...allDiscounts.list.count-1{
        let likesDB = Database.database().reference().child("Discounts")
        let likeDictionary = ["BusinessID": "\(i)","businessName":"\(allDiscounts.list[i].businessName)","DateNumber": "\(allDiscounts.list[i].dateApplied)","theDeal": "\(allDiscounts.list[i].theDeal)" ,"PhoneNumberText": "\(allDiscounts.list[i].phoneNumber)","ImageName": "\(allDiscounts.list[i].imageName)","DateText": "\(allDiscounts.list[i].dateText)" ,"phoneNumberInteger": "\(allDiscounts.list[i].numberNumber)","companyLogo": "\(allDiscounts.list[i].companylogo)","r1": "\(allDiscounts.list[i].r1)" ,"r2": "\(allDiscounts.list[i].r2)","r3": "\(allDiscounts.list[i].r3)","classification": "\(allDiscounts.list[i].classification)"] as [String : String]
        likesDB.child("\(allDiscounts.list[i].businessName)").setValue(likeDictionary) {
            (error, reference) in
            if error != nil{
                let alert = UIAlertController(title: "Error", message: "There was an error registering your like. Reconnect online and try again", preferredStyle: .alert)
                let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil)
                alert.addAction(okAction)
                self.present(alert,animated: true)
                //                    self.showerror()
            }
            else{
                print("Message Saved Successfully")
            }
        }
        }
    }

1 个答案:

答案 0 :(得分:1)

可能必须从Firebase服务器下载数据。由于这可能需要一些时间,因此该数据是异步加载的。 Firebase不会阻止您的主要代码(并使您的应用程序无响应),而是允许您的主要代码继续运行,并在数据可用时调用完成处理程序。

这一切意味着,需要数据库中数据的任何代码都必须在完成处理程序内部

因此,您的情况如下:

let likesDB = Database.database().reference().child("Discounts")
likesDB.observe(.childAdded) { (snapshot) in
    let snapshotValue = snapshot.value as! Dictionary<String , String>
    let businessID = Int(snapshotValue["BusinessID"]!)
    let businessName = snapshotValue["businessName"]!
    let DateNumber = Int(snapshotValue["DateNumber"]!)
    let theDeal = snapshotValue["theDeal"]!
    let phoneNumber = snapshotValue["PhoneNumberText"]!
    let imageName = snapshotValue["ImageName"]!
    let dateText = snapshotValue["DateText"]!
    let phoneNumberInteger = Int(snapshotValue["phoneNumberInteger"]!)
    let companyLogo = snapshotValue["companyLogo"]!
    let r1 = Int(snapshotValue["r1"]!)
    let r2 = Int(snapshotValue["r2"]!)
    let r3 = Int(snapshotValue["r3"]!)
    let classification = snapshotValue["classification"]!
    let allTheLikes = likeclass()
    allTheLikes.discountID = businessID!
    allTheLikes.businessName = businessName
    allTheLikes.dateApplied = DateNumber!
    allTheLikes.theDeal = theDeal
    allTheLikes.phoneNumber = phoneNumber
    allTheLikes.imageName = imageName
    allTheLikes.dateText = dateText
    allTheLikes.numberNumber = phoneNumberInteger!
    allTheLikes.companylogo = companyLogo
    allTheLikes.r1 = r1!
    allTheLikes.r2 = r2!
    allTheLikes.r3 = r3!
    allTheLikes.classification = classification
    self.theLikeArray.append(allTheLikes)

    print(theLikeArray)
}

请注意,这是令人难以置信的常见混乱根源,因此我强烈建议您阅读有关该主题的其他一些问题: