具有多种对象的Firestore快照图

时间:2018-06-30 19:06:30

标签: arrays swift firebase google-cloud-firestore

我遵循此tutorial来从Firebase Firestore执行查询

只要我只有一种类型的对象注意,一切都很好。 这是我的对象结构:

protocol DocumentSerializable {

init?(dictionary:[String:Any])

}

struct Note {

var title:String
var date:Date
var text:String
var type:String

var dictionary:[String:Any] {

    return [
        "title":title,
        "date":date,
        "text":text,
        "type":type,
    ]

}

}

extension Note : DocumentSerializable {

init?(dictionary: [String : Any]) {

    guard let title = dictionary["title"] as? String,
        let date = dictionary["date"] as? Date,
        let text = dictionary["text"] as? String,
        let type = dictionary["type"] as? String else {return nil}

    self.init(title: title, date: date, text: text, type: type)

}

我创建了另一个具有相同协议和不同属性的结构任务,但是我不知道如何将其与其他结构映射在一起,以便在同一数组中具有注意和任务

var db:Firestore!
var itemsArray = [Note]() //How can I add the tasks too?

func loadData() {

    db.collection("items").order(by: "date", descending: true).getDocuments() {

        querySnapshot, error in
        if let error = error {

            print("\(error.localizedDescription)")

        } else {
            //HERE!
            self.itemsArray = querySnapshot!.documents.compactMap({Note(dictionary: $0.data())})
            DispatchQueue.main.async {
                self.collectionView.reloadData()
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

不需要.compactMap ...如果仅根据document.data键创建和创建“ Note”或“ Task”的实例,这应该非常简单。

我猜测“注释”中的type属性会告诉您对象是注释还是任务,对吗?如果是这样,您可以做这样的事情

var itemsArray = [Any?]()

func loadData() {

    db.collection("items").order(by: "date", descending: true).getDocuments() {

        querySnapshot, error in
        if let error = error {

            print("\(error.localizedDescription)")

        } else {

            guard let documents = querySnapshot.documents else {return}
            for document in documents {
                let dictionary = document.data() as [String : Any]
                if dictionary["type"] == "note" {
                    let note = Note(dictionary: dictionary)
                    self.itemsArray.append(note)
                } else if dictionary["type"] == "task" {
                    let task = Task(dictionary: dictionary)
                    self.itemsArray.append(task)
                }
                self.collectionView.reloadData()
            }
        }
    }
}

如果“类型”没有告诉您该项目是注释还是任务,则可以在字典中查看唯一的“注释”或“任务”键。