【问题标题】:Make code with Firebase asynchronous使用 Firebase 异步编写代码
【发布时间】:2017-07-16 19:06:57
【问题描述】:

我正在尝试创建一个算法,该算法创建 12 个结构对象(问题)并将它们放入一个数组(问题)中。但是,它似乎不起作用,因为对象是在 Firebase 的数据能够修改它们之前创建的。我试图使它们异步,但我在网上发现没有任何效果。提前致谢。

let databaseRef = FIRDatabase.database().reference()
    databaseRef.child("NumberOfQuestions").observeSingleEvent(of: .value, with: { snapshot in
    while self.questions.count < 12{
    var question = questionMGR() //questionMGR is the name of my struct
    let questionNumber = String(Int(arc4random_uniform(snapshot.value as! UInt32) + 1))

    databaseRef.child("questions").child("questionNumber: " + questionNum).child("title").observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot.value ?? "")
        question.title = (snapshot.value as? String)!

        databaseRef.child("questions").child("questionNumber: " + questionNum).child("description").observeSingleEvent(of: .value, with: { snapshot in
            print(snapshot.value ?? "")
            question.desc = (snapshot.value as? String)!
        })
    })
        self.questions.append(question)
   }
 })

【问题讨论】:

    标签: swift firebase swift3 firebase-realtime-database


    【解决方案1】:

    发生这种情况时,解决方法通常是将操作移动到内部回调中:

    databaseRef.child("questions").child("questionNumber: " + questionNum).child("title").observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot.value ?? "")
        question.title = (snapshot.value as? String)!
    
        databaseRef.child("questions").childSnapshot(forPath: "questionNumber: " + questionNum).childSnapshot(forPath: "description").observeSingleEvent(of: .value, with: { snapshot in
            print(snapshot.value ?? "")
            question.desc = (snapshot.value as? String)!
            self.questions.append(question)
        })
    })
    

    但在这种情况下,我想知道您为什么不简单地一次性加载整个问题:

    FIRDatabaseReference qref = databaseRef.child("questions").child("questionNumber: " + questionNum)
    qref.observeSingleEvent(of: .value, with: { snapshot in
        var question = questionMGR()
        question.title = (snapshot.childSnapshot(forPath: "title").value as? String)!
        question.desc = (snapshot.childSnapshot(forPath: "description").value as? String)!
        self.questions.append(question)
    })
    

    我会考虑对标题和描述进行两次单独调用的唯一原因是,如果您的问题包含更多您在此处不需要的数据。但如果是这种情况,我会改造您的 JSON 以将标题和描述分离到单独的顶级列表中。

    在 NoSQL 中,将数据建模为与屏幕上显示的非常相似通常是一件好事 (tm)。因此,如果您有每个问题的标题和描述的列表,您应该考虑精确存储:每个问题的标题和描述的列表。

    【讨论】:

    • 感谢您的帮助,但我已经尝试了第一个选项,但它根本不起作用。此外,第二个选项似乎很有希望,但我在第四行和第五行收到错误“数据类型 FIRDataSnapshot 的值没有成员子项”。
    • 抱歉,我忘记了获取快照子项的语法在 iOS 上与其他平台略有不同。我更新了代码。
    • 还有一个问题是,如果有一个while循环,代码就不能工作。任何可能的解决方案?
    • 我认为这就是一直搞砸我的代码的原因。
    • 你有什么解决办法吗?
    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多