Firebase将快照值转换为对象 [英] Firebase converting snapshot value to objects

查看:161
本文介绍了Firebase将快照值转换为对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个postDict作为[String:AnyObject],我有一个模型类Post。



有没有一个快速的方法来将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆