Firebase Swift 3 Xcode 8 – 遍历观察结果
我已经浏览了Firebase上的文档以及Stack Overflow和YouTube教程,但是如果通过Firebase获取数据,我可以了解如何获取数据。
我是Firebase的新手,并且正在将我的项目从Parse切换到Firebase。
例如:我在Firebase中有一个数据,如下所示:
我可以在Swift中抓住所有的主题:
let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL) let topicsRef = refDB.child("topics") // FIRDataSnapshot. topicsRef.observe(.value, with: { snapshot in for child in snapshot.children { print("child ------") print(child) // Get the bits HOW DO I PARSE EACH SET } })
当我遍历for循环时,我打印出如下所示的东西:
child ------ Snap (-KYCqk2_AVkUd8s9cKit) { createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1; description = "Match states with their capitals"; name = "State Caiptals"; tags = { 0 = Geography; 1 = USA; }; } child ------ Snap (-KYCqk2_AVkUd8s9cKiu) { createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1; description = "Name the parts of an Atom"; name = "Parts of an Antom"; tags = { 0 = Physics; 1 = Atom; 2 = Electron; }; }
我的问题是,我怎么得到的数据:
我需要的密钥(KYCqk2_AVkUd8s9cKiu)我需要的描述和名称我需要一个标签数组
– 所有在本地variables?
基本上,我只想读所有的Topics
并在本地内存中有一系列的Topics
。
我可以照顾构buildClass类的主题,但是我已经尝试了几种方法来获取数据,但没有运气。 必须有一个简单的方法来parsing结果,但我还没有find一个例子或文档。
希望能得到一些帮助或指向某些文档或教程。
=================================
更新的代码
嗨,我改变了代码,以尝试提供的样本相匹配。 代码现在看起来像下面我放在一个循环计数器,看看发生了什么事,为什么崩溃。
FDataSnapshot没有定义,因此我使用了FIRDataSnapshot。
这是现在崩溃的代码的新尝试。 进一步下面我显示我的更改,使其不会崩溃 – 以及有关安全地处理标签子节点的问题 。 感谢指针。 我现在有一些工作。
// HERE is a way to get all the Topics let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL) let topicsRef = refDB.child("topics") // FIRDataSnapshot. topicsRef.observe(.value, with: { snapshot in if snapshot.value is NSNull { print("not found") } else { var loopCount = 1 // count loops to see how may time trying to loop for child in snapshot.children { print(" ") print(" ") print("child ------ loop \(loopCount)") print(child) let snap = child as! FIRDataSnapshot //each child is a snapshot let dict = snap.value as! [String: String] // the value is a dictionary let name = dict["name"]! let description = dict["description"]! let createdBy = dict["createdBy"]! print("the bits ------") print("name .... \(name)") print("description .... \(description)") print("createdBy .... \(createdBy)") loopCount += 1 } } })
我有定义零断点 – 但是代码停止在这个断点(当我有零确定定义肯定)
libswiftCore.dylib`_swift_bridgeNonVerbatimFromObjectiveC: 0x1144a4270 <+0>: pushq %rbp 0x1144a4271 <+1>: movq %rsp, %rbp 0x1144a4274 <+4>: pushq %r15
…在这里打破三次,然后在这一行崩溃的应用程序让dict = snap.value为! [String:String]带有消息“Thread 1:EXC_BAD_INSTRUCTION(code = EXEC_1386_INVOP,subside = 0x0)
我不知道为什么代码有断点,为什么它崩溃。 可能会因为标签是子节点而不匹配时撞上标签[String,String]
我打印在日志中,然后去繁荣!
child ------ loop 1 Snap (-KYI2MszjC9pK_4oIvKu) { createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1; description = "Match states with their capitals"; name = "State Caiptals"; tags = { 0 = Geography; 1 = USA; }; }
=====
如果我改变线使用“任何”….那么它的作品
let dict = snap.value as! [String: Any]
新的工作代码….
// HERE is a way to get all the Topics let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL) let topicsRef = refDB.child("topics") // FIRDataSnapshot. topicsRef.observe(.value, with: { snapshot in if snapshot.value is NSNull { print("not found") } else { var loopCount = 1 // count loops to see how may time trying to loop for child in snapshot.children { print(" ") print(" ") print("child ------ loop \(loopCount)") let snap = child as! FIRDataSnapshot //each child is a snapshot if snap.value != nil { print("key ... \(snap.key)") let dict = snap.value as! [String: Any] // the value is a dictionary let name = dict["name"] as! String let description = dict["description"] as! String let createdBy = dict["createdBy"] as! String let tags = dict["tags"] as! NSArray /* Thought I could loop tags as! Dictionary but that does not work. Compiles but runtime crashes. var tagsArray = [String]() if tags != nil && tags.count > 0 { for (key, value) in tags { tagsArray.append(value) } } */ // Test to see what we got ... print("the bits ------") print("name .... \(name)") print("description .... \(description)") print("createdBy .... \(createdBy)") print("tags ... \(tags) ... count \(tags.count)") loopCount += 1 } else { print("bad snap") } } } })
我想出了由其他响应发送的文档链接的主题密钥。 谢谢。
我不知道我正确获取标签值。 这实际上只是一个字典,我试图这样的方式,但运行时崩溃,并希望将标签投给NSArray ….所以我在代码中做到了这一点,它的工作原理,但不知道如果这是安全的,因为这不是定义为一个数组,即使它作为一个数组返回。
这完全是关于字典。
给定一个示例节点
people_foods -Yinasdjasjd name: "Leroy" food: "Pizza" -Yk9j9s9soks name: "Pete" food: "Wings"
这段代码将数据作为一个快照,并迭代它来打印这个人和他们的食物。
let ref = self.myRootRef.child(byAppendingPath: "people_foods")! ref.observe(.value, with: { snapshot in if ( snapshot!.value is NSNull ) { print("not found") } else { for child in (snapshot?.children)! { let snap = child as! FDataSnapshot //each child is a snapshot let dict = snap.value as! [String: String] // the value is a dict let name = dict["name"] let food = dict["food"] print("\(name) loves \(food)") } } })
每个孩子的父节点名称也可以通过child.keyfind。
一个典型的devise模式是利用一组类(或字典或结构等)作为tableView的数据源。 你可以遍历这些子类并为每个子类创build一个类并将其附加到tableView。 完成后,tableView.reloadData更新UI。
记住Firebase是asynchronous的,所以不要试图访问Observe闭包外的数组,直到其中的代码完成。
FIRDataSnapshot的value属性将快照的内容作为标准基础types返回。
你可以通过我的SnapshotParser轻松完成。
你需要下面的代码来获得一个快速的表示:
func main(){ let topics=SnapshotParser().parseAsList(snap: Snapshot, type: Topic.self) for topic in topics{ //do something with your object } } class Topic: ParsableSnapshot { var id:String?=nil var createdBy:String?=nil var description:String?=nil var name:String?=nil var tags:[Int:String]?=nil required init(){} func bindProperties(binder: SnapshotParser.Binder) { binder.bindField(name: "id", field: &id) binder.bindField(name: "createdBy", field: &createdBy) binder.bindField(name: "description", field: &description) binder.bindField(name: "name", field: &name) binder.bindDictionary(name: "tags", dict: &tags) } }