Как добавить идентификатор документа Firestore в мою модель, а затем в массив? - PullRequest
1 голос
/ 26 января 2020

У меня есть структура "Order", которая содержит поле с именем orderId:

protocol OrderSerializable {
    init?(dictionary:[String:Any])
}

struct Order {
    var orderId: String
    var status: Int
    var currentTotal: Double

    var Dictionary:[String : Any] {
        return [
            "orderId": orderId,
            "status": status,
            "currentTotal": currentTotal
        ]
    }
}

extension Order : OrderSerializable {
    init?(dictionary: [String : Any]) {
        guard let orderId = dictionary["orderId"] as? String,
        let status = dictionary["status"] as? Int,
        let currentTotal = dictionary["currentTotal"] as? Double

        else { return nil }

        self.init(orderId: orderId, status: status, currentTotal: currentTotal)
    }
}

Мне нужно добавить идентификатор документа firestore в поле orderId в массиве модели, т.е. "ordersArray". Как мне go сделать это?

Это мой код запроса, и я указал нужную мне строку:

orderRef.getDocuments() {
            querySnapshot, error in
            if let error = error {
                print("\(error.localizedDescription)")
            } else {
                guard let documents = querySnapshot?.documents else { return }
                for document in documents {
                    let orderDictionary = document.data() as [String : Any]
                    let order = Order(dictionary: orderDictionary)
                    // Here I want to append the firestore documentId to order.orderId before appending it to the array
self.ordersArray.append(order!)

                }
                DispatchQueue.main.async {
                    self.ordersTableView?.reloadData()
                }
            }
        }

Заранее спасибо.

Другая ошибка enter image description here

1 Ответ

1 голос
/ 26 января 2020

Измените ваше расширение, чтобы принять documentId в качестве дополнительного параметра, и передайте его в созданный объект Order.

protocol OrderSerializable {
    init?(dictionary:[String:Any], id: String)
}
extension Order : OrderSerializable {
    init?(dictionary: [String : Any], id: String) {
        guard let status = dictionary["status"] as? Int,
        let currentTotal = dictionary["currentTotal"] as? Double
        else { return nil }

        self.init(orderId: id, status: status, currentTotal: currentTotal)
    }
}

Затем, когда вы создаете каждый ордер, передайте documentId как id параметр.

orderRef.getDocuments() {
            querySnapshot, error in
            if let error = error {
                print("\(error.localizedDescription)")
            } else {
                guard let documents = querySnapshot?.documents else { return }
                for document in documents {
                    let orderDictionary = document.data() as [String : Any]
                    let order = Order(dictionary: orderDictionary, id: document.documentId)
                    self.ordersArray.append(order!)

                }
                DispatchQueue.main.async {
                    self.ordersTableView?.reloadData()
                }
            }
        }

В качестве альтернативы, вы могли бы сохранить orderId непосредственно в самом документе, чтобы он передавался вместе со словарем, избегая необходимости использования documentId .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...