2017-02-26 75 views
0

我正在嘗試創建一個創建12個結構對象(問題)並將它們放入數組(問題)的算法。但是,它似乎不起作用,因爲在Firebase的數據能夠修改它們之前創建對象。我試圖讓他們異步,但沒有我在網上找到的工作。提前致謝。用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) 
    } 
}) 

回答

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)。所以如果你有一個列表,如果每個問題的標題和描述,你應該考慮精確地存儲:每個問題的標題和描述的列表。

+0

感謝您的幫助,但我已經嘗試了第一個選項,它根本不工作。此外,第二個選項似乎很有前途,但我在第四和第五行出現錯誤「類型數據的值FIRDataSnapshot沒有成員子」。 – joshLor

+0

對不起,我忘記了獲取快照的孩子的語法在iOS上比在其他平臺上有點不同。我更新了代碼。 –

+0

還有一個問題是,如果周圍有一個while循環,則代碼不起作用。任何可能的解 – joshLor