Как добавить словарь с объектами в массив с помощью FIrebase - PullRequest
0 голосов
/ 03 июня 2018

Я работаю с Firebase. Я могу получить в ответ словарь, который выглядит так:

▿ 0 : 2 elements
    - key : "maskForHair"
    ▿ value : 3 elements
      ▿ 0 : 2 elements
        - key : id
        - value : 1
      ▿ 1 : 2 elements
        - key : name
        - value : Hair Mask
      ▿ 2 : 2 elements
        - key : note
        - value : asd
  ▿ 1 : 2 elements
    - key : "hairShampo"
    ▿ value : 3 elements
      ▿ 0 : 2 elements
        - key : id
        - value : 0
      ▿ 1 : 2 elements
        - key : name
        - value : hairShampo
      ▿ 2 : 2 elements
        - key : note
        - value : asd

Теперь я пытаюсь заполнить tableView, используя этот словарь, но я не могу найтиспособ добавить этот dict к массиву, есть идеи?

Вот так выглядит моя функция getCategories:

func getCategories(){

    dbHandle = dbRefernce?.child("categories").observe(.value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String : Any]{

            print(dictionary)

            let category = Categories(dictionary: dictionary)
            self.categoriesArr.append(category)

            DispatchQueue.main.async {
                self.categoriesTableView.reloadData()
            }
        }
    })
}

А вот как выглядит мой класс Categories:

import Foundation
import UIKit

class Categories: NSObject {

    var name : String? = nil
    var id : Int? = nil
    var note : String? = nil

    init (dictionary: [String: Any]) {
        super.init()
        name = dictionary["name"] as? String
        id = dictionary["id"] as? Int
        note = dictionary["note"] as? String
    }

}

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вот как я с этим справился:

 for index in 1...self.numberOfProducts{

        dbHandle = dbRefernce?.child("categories").child("\(index)").observe(.value, with: { (snapshot) in
            guard let value = snapshot.value as? [String: Any] else { return }
            guard let name = value["name"] as? String,
                let imageURL = value["imageURL"] as? String,
                let desc = value["description"] as? String,
                let price  = value["price"] as? Int,
                let id = value["subCategoryID"] as? Int
                else {return}


            let category = Product(name: name, imageURL: imageURL, description: desc, price: price,subCategoryID: id)

            self.productsArr.append(category)
            self.tblProducts.reloadData()
        })
    }

Просто создал объект и затем добавил его в массив, вы можете сделать это в цикле

0 голосов
/ 03 июня 2018

Я бы начал с переименования вашей модели во что-то особенное, например HairCategory.

Вам нужно перебрать дочерние элементы снимка, который вы получаете из базы данных.Каждый дочерний элемент должен быть [String : Any] словарем, который затем можно превратить в HairCategory.

Примерно так:

let children = snapshot.children.compactMap { $0 as? DataSnapshot }
let cateroryDictionaries = children.compactMap { $0.value as? [String:Any] }
let categories = cateroryDictionaries.map { dict -> HairCategory in
    return HairCategory.init(dictionary: dict)
}

Тогда categories имеет тип: [HairCategory],Если вы также сделаете свой self.categoriesArr типа [HairCategory], вы можете добавить вновь извлеченные категории :)

Редактировать :

Я также могу порекомендовать взглянуть наэта библиотека: CodableFirebase .Это делает преобразование из DataSnapshot в ваши модели и другие способы, очень просто ..

Редактировать

Просто чтобы уточнить ... Вы не можете "добавить словарь... в массив », вам необходимо преобразовать словарь в массив, а затем добавить этот массив в другой массив того же типа:)

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