我正在使用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,但我找不到将这个字典附加到数组的方法,任何想法?
这就是我的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
}
}
答案 0 :(得分:0)
我首先将你的模型重命名为像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转换到你的模型和另一种方式,真的很容易..
修改强>
只是为了澄清......你不能将字典...附加到数组中,你需要将字典转换为数组,然后你可以将该数组附加到另一个数组相同类型的数组:)
答案 1 :(得分:0)
这就是我如何解决的问题:
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()
})
}
刚刚创建了一个对象,然后将其附加到数组中, 你可以在循环中做到这一点