Firebase将快照值转换为对象 [英] Firebase converting snapshot value to objects
问题描述
有没有一个快速的方法来将postDict转换为Post对象的数组,以便在出列单元格时,它将是:
cell.textLabel.text = posts [indexPath.item] .author
导入UIKit
导入Firebase
class ViewController:UIViewController {
var posts = [Post]()
覆盖func viewDidLoad(){
super。 viewDidLoad()
let ref = FIRDatabase.database()。reference()。child(posts)。queryLimitedToFirst(5)
ref.observeEventType(FIRDataEventType.ChildAdded ,withBlock:{$(snapshot)in
let postDict = snapshot.value as![String:AnyObject]
print(postDict)
//将postDict转换为Post对象的数组
})
}
}
class Post:NSObject {
var author:String =
var body :String =
var imageURL:String =
var uid:String =
}
这是输出postDict时的输出:
尝试使用我在下面创建的类,协议和扩展名,它将为您节省大量时间,试图将快照映射到对象。
//
// FIRDataObject.swift
//
//由Callam Poynter创建24 / 06/2016。
//
导入Firebase
类FIRDataObject:NSObject {
让snapshot:FIRDataSnapshot
var key:String {返回snapshot.key}
var ref:FIRDatabaseReference {return snapshot.ref}
init(快照:FIRDataSnapshot){
self.snapshot =快照
super.init()
在snapshot.children.allObjects中作为child? [FIRDataSnapshot] ?? [] {
if respondsToSelector(Selector(child.key)){
setValue(child.value,forKey:child.key)
}
}
}
协议FIRDatabaseReferenceable {
var ref:FIRDatabaseReference {get}
}
扩展FIRDatabaseReferenceable {
var ref:FIRDatabaseReference {
return FIRDatabase.database()。reference()
}
}
现在可以创建一个继承FIRDataObject类的模型,并可以使用FIRDataSnapshot初始化。然后将FIRDatabaseReferenceable协议添加到您的ViewController中,以访问您的基础引用。
导入Firebase
导入UIKit
$ b $ class ViewController:UIViewController,FIRDatabaseReferenceable {
var post:[Post] = []
覆盖func viewDidLoad(){
super.viewDidLoad()
ref.child(posts)。observeEventType(.ChildAdded,withBlock:{
self.posts.append(Post(snapshot:$ 0))$
$ body $
$ b $对于Swift 3来说,更新
class FIRDataObject :NSObject {
let snapshot:FIRDataSnapshot
var key:String {return snapshot.key}
var ref:FIRDatabaseReference {return snapshot.ref}
需要init(快照:FIRDataSnapshot){
self.snapshot =快照
$ b super.init()
.children.allObjects as? [FIRDataSnapshot] ?? [] {
if responds(to:Selector(child.key)){
setValue(child.value,forKey:child.key)
}
}
}
}
So I have a postDict as [String: AnyObject] and I have a model class Post.
Is there a quick way to convert postDict to an array of Post objects so that when dequeuing the cell, it will be:
cell.textLabel.text = posts[indexPath.item].author
import UIKit
import Firebase
class ViewController: UIViewController {
var posts = [Post]()
override func viewDidLoad() {
super.viewDidLoad()
let ref = FIRDatabase.database().reference().child("posts").queryLimitedToFirst(5)
ref.observeEventType(FIRDataEventType.ChildAdded, withBlock: { (snapshot) in
let postDict = snapshot.value as! [String : AnyObject]
print(postDict)
//convert postDict to array of Post objects
})
}
}
class Post: NSObject {
var author: String = ""
var body: String = ""
var imageURL: String = ""
var uid: String = ""
}
This is the output when printing out postDict:
解决方案 Try using the class, protocol and extension I have created below, it will save you a lot of time trying to map the snapshots to objects.
//
// FIRDataObject.swift
//
// Created by Callam Poynter on 24/06/2016.
//
import Firebase
class FIRDataObject: NSObject {
let snapshot: FIRDataSnapshot
var key: String { return snapshot.key }
var ref: FIRDatabaseReference { return snapshot.ref }
required init(snapshot: FIRDataSnapshot) {
self.snapshot = snapshot
super.init()
for child in in snapshot.children.allObjects as? [FIRDataSnapshot] ?? [] {
if respondsToSelector(Selector(child.key)) {
setValue(child.value, forKey: child.key)
}
}
}
}
protocol FIRDatabaseReferenceable {
var ref: FIRDatabaseReference { get }
}
extension FIRDatabaseReferenceable {
var ref: FIRDatabaseReference {
return FIRDatabase.database().reference()
}
}
Now you can create a model that inherits the FIRDataObject class and can be initialised with a FIRDataSnapshot. Then add the FIRDatabaseReferenceable protocol to your ViewController to get access to your base reference.
import Firebase
import UIKit
class ViewController: UIViewController, FIRDatabaseReferenceable {
var posts: [Post] = []
override func viewDidLoad() {
super.viewDidLoad()
ref.child("posts").observeEventType(.ChildAdded, withBlock: {
self.posts.append(Post(snapshot: $0))
})
}
}
class Post: FIRDataObject {
var author: String = ""
var body: String = ""
var imageURL: String = ""
}
UPDATE for Swift 3
class FIRDataObject: NSObject {
let snapshot: FIRDataSnapshot
var key: String { return snapshot.key }
var ref: FIRDatabaseReference { return snapshot.ref }
required init(snapshot: FIRDataSnapshot) {
self.snapshot = snapshot
super.init()
for child in snapshot.children.allObjects as? [FIRDataSnapshot] ?? [] {
if responds(to: Selector(child.key)) {
setValue(child.value, forKey: child.key)
}
}
}
}
这篇关于Firebase将快照值转换为对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!