Ошибка Invalid Firebase Data при попытке сохранить в Firebase с помощью Swift - PullRequest
0 голосов
/ 12 марта 2020

Цель: сохранить порядок напитков в Firebase

Проблема: преобразование массива [Drink] в словарь

Я получаю следующее сообщение об ошибке:

ОШИБКА: 'InvalidFirebaseData', причина: '(setValue: withCompletionBlock :) Невозможно сохранить объект типа vipeeps. Выпить по напиткамOrdered.0009373. Может хранить только объекты типа NSNumber, NSString, NSDictionary и NSArray. '

func saveDrinkOrder(orderRef: String, venueName: String, drinksOrder: [Drink], chargeId: String, chargeObject: [String: Any], handler: @escaping(Bool) -> ()){

        guard let uid = Auth.auth().currentUser?.uid else { return }

        let orderNo = orderRef

        let timeStamp = Date().timeIntervalSince1970

        let drinksOrdered = Dictionary(uniqueKeysWithValues: drinksOrder.map {($0.posId, $0.self)}) //<---issue here: $0.self if still a Drink object

        let venue = venueName

        let stripeChargeResponse = chargeObject

        let ref = REF_DRINK_ORDERS.child(uid).child(orderNo)


        //message node values
        let values = [
            "dateOrdered": timeStamp,
            "venueName": venue,
            "timeStamp": Date().timeIntervalSince1970,
            "drinksOrdered": drinksOrdered,
            "stripeResponse": stripeChargeResponse] as [String : Any]

        ref.setValue(values) { (error, dbRef) in

            if error != nil {
                print(error!.localizedDescription)
                handler(false)
                return
            }

            handler(true)

        }//end setValue

    }//end func

asdf

class Drink {

    var posId: String?
    var name: String?
    var description: String?
    var tags: [String]?
    var unitPrice: String?

    init(dictionary: [String: Any]) {

        self.posId = dictionary["posId"] as? String
        self.name = dictionary["name"] as? String
        self.description = dictionary["description"] as? String
        self.unitPrice = dictionary["unitPrice"] as? String
        self.tags = dictionary["tags"] as? [String]


    }//end init

}//end class

1 Ответ

0 голосов
/ 12 марта 2020

Я понял это, возможно, не самый эффективный подход, но он работает:

  1. Я обновил свой класс Drink, чтобы он возвращал объект в виде словаря [String: Any]

    var asDictionary: [String: Any] {let mirror = Mirror (отражающий: self) let dict = Dictionary (uniqueKeysWithValues: mirror.children.lazy.map ({(label: String ?, значение: Any) -> ( String, Any)? В охране, пусть label = label else {return nil} return (label, value)}). CompactMap {$ 0}) return dict}

  2. L oop через массив [Drinks] для создания словаря для Firebase

    var drinkDict = String: Any

        for drink in drinksOrder {
            drinksDict[drink.posId!] = drink.asDictionary
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...