我有一个UICollectionView,我使用类填充数据。截至目前,我正在使用虚拟数据填充它,如下面的代码所示。我试图用我的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
,使用let ref = Firebase(url: "my app url")
识别我的firebase数据库并使用
ref.observeEventType(.Value, withBlock: { snapshot in
print(snapshot.value)
}, withCancelBlock: { error in
print(error.description)
})
我能够读取子数据,但我无法在函数的return
块中使用它。理想情况下,我想使用enumerator = snapshot.childrenCount
,并反复使用return
函数,因为感兴趣的节点中有很多孩子。
任何帮助/方向将不胜感激。
答案 0 :(得分:1)
createMrNobody()函数调用是同步的,当您从Firebase检索数据时,它的行为方式不同。
Firebase本质上是异步的,因此当您向它请求数据时,您必须等待在处理数据之前检索该数据。否则,处理代码将在Firebase准备好数据之前执行。
它与函数调用的SQL查询不同,整个过程是同步的。
不确定这是否有帮助,但这里有一个示例:假设我们有一个存储人员的数组,我们需要从Firebase填充它。
我们首先定义人类
class Person {
var title: NSString?
var aDescription: NSString?
}
和存储人员的数组
var myArray = [Person]()
当您准备从Firebase加载它们时,就会这样做
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!)")
}
})
}