所以我有一个postDict作为[String:AnyObject],我有一个模型类Post.
有没有一种快速的方法来将PostDict转换为一个Post对象数组,以便在对单元格进行排队时,它将是:
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 = "" }
这是打印postDict时的输出:
尝试使用下面创建的类,协议和扩展名,它会节省大量时间尝试将快照映射到对象.
// // 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() } }
现在,您可以创建一个继承FIRDataObject类的模型,并可以使用FIRDataSnapshot进行初始化.然后将FIRDatabaseReferenceable协议添加到您的ViewController以访问您的基准引用.
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 = "" }
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) } } } }