2016-04-01 49 views
0

我有一個UICollectionView,我使用一個類來填充數據。到目前爲止,我正在填充虛擬數據,如下面的代碼所示。我試圖用我的Firebase數據庫中的數據替換此虛擬數據。如何使用類返回Firebase數據?

import UIKit 

class MrNobody 
{ 
// MARK: - Public API 
var title = "" 
var description = "" 
var numberOfMembers = 0 
var numberOfPosts = 0 
var featuredImage: UIImage! 

init(title: String, description: String, featuredImage: UIImage!) 
{ 
    self.title = title 
    self.description = description 
    self.featuredImage = featuredImage 
    numberOfMembers = 1 
    numberOfPosts = 1 
} 

// MARK: - Private 
// dummy data 
static func createMrNobody() -> [MrNobody] 
{ 
    return [ 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 

    ] 
} 
} 

爲了包括數據,我已經包括import Firebase,確定使用

ref.observeEventType(.Value, withBlock: { snapshot in 
print(snapshot.value) 
}, withCancelBlock: { error in 
print(error.description) 
}) 

我能夠讀出子數據使用let ref = Firebase(url: "my app url")和讀取數據我的火力點的數據庫,但我不能夠在函數的return塊中使用它。理想情況下,我想使用enumerator = snapshot.childrenCount,並且反覆使用return函數,因爲有多少孩子在感興趣的節點中。

任何幫助/方向將不勝感激。

+0

嘿OP,我知道你的問題已經得到解答,但我鼓勵你僅僅在'MrNobody'類中做一個初始化者需要一個'FDataSnapshot'。這是一個很好的做法,因爲它允許代碼的可重用性,以防您需要在代碼中的多個位置使用這些快照(也許如果您聆聽'.ChildAdded'和'.ChildRemoved'事件類型)。 –

回答

1

createMrNobody()函數調用是同步的,當您從Firebase檢索數據時,其行爲方式不同。

Firebase本質上是異步的,所以當你問它數據時,你必須等待數據在處理之前被檢索。否則,處理代碼將在Firebase準備好數據之前執行。

它與整個進程同步的函數調用的SQL查詢不同。

不確定這是否有幫助,但下面是一個示例:假設我們有一個存儲人員的數組,並且需要從Firebase填充數組。

我們首先定義Person類

class Person { 
     var title: NSString? 
     var aDescription: NSString? 
    } 

和存儲人

var myArray = [Person]() 

和數組,當您準備從火力地堡加載它們,這將做到這

func loadMyPeople() { 

    myUsersRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 

     for child in snapshot.children { 
      let title = child.value["title"] as! String 
      let description = child.value["description"] as! String 
      let dude = Person() 
      dude.title = title 
      dude.aDescription = description 
      self.myArray.append(dude) 
     } 

     //after all your people are loaded in the array, print it's contents 
     // you could also reload a tableView here as well. 
     for dude in self.myArray { 
      print("email: \(dude.title!) desc: \(dude.description!)") 
     } 
    }) 
} 
+0

謝謝。我能夠使用此配方從Firebase數據庫中將數據讀取到TableView。爲了完整起見,我必須在Class文件中將'title:NSString,description:NSString'更改爲'title =「」,description =「」'。否則,我得到一個''lldb:發現零,而解包可選「錯誤。 – KuboAndTwoStrings

+0

@AtlasShrugged我正在使用Swift 2,並沒有收到該錯誤 - 他們應該可能在每個我的代碼的選項中定義,所以也許他們的錯誤產生其他地方時,其中一個屬性是零?請注意我的Person類是NSObject的一個子類,它已經有一個屬性'description',所以這是一個衝突。我更新了我的答案,並將描述更改爲描述。我很高興我的回答有幫助! – Jay