swift - Firebase 将快照值转换为对象

标签 swift firebase firebase-realtime-database

所以我有一个 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 时的输出:

enter image description here

最佳答案

尝试使用我在下面创建的类、协议(protocol)和扩展,它将为您节省大量尝试将快照映射到对象的时间。

//
//  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 协议(protocol)添加到您的 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)
            }
        }
    }
}

关于swift - Firebase 将快照值转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038990/

相关文章:

swift - tableview 将标签高度设置为零和正确的值,然后选择保留零以使标签消失

firebase - 为 Firebase 托管设置 Github 操作时找不到 package.json 文件

javascript - 从多个位置删除相同的值 Firebase 函数

android - Firebase - 无法解析符号 'MyFirebaseMessagingService'

Firebase Firestore 规则 : will get()'ing the document being checked counted as another read?

cordova - Firebase:在使用 .once() 检索所有子节点后监听它们的变化?

javascript - 检查 firebase 数据库中是否存在值

swift - Clipped Image 在框架外调用 TapAction

ios - 将在整个应用程序或类(class)中使用的颜色

swift - 使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序