[ios] Firebase Swift 3 Xcode 8 - 遍歷觀察結果


Answers

FIRDataSnapshot的value屬性將快照的內容作為標準基礎類型返回。

Question

我已經瀏覽了Firebase上的文檔以及和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)我需要的描述和名稱我需要一個標籤數組

- 所有在本地變量?

基本上,我只想讀所有的Topics並在本地內存中有一系列的Topics

我可以照顧構建Class類的主題,但是我已經嘗試了幾種方法來獲取數據,但沒有運氣。 必須有一個簡單的方法來解析結果,但我還沒有找到一個例子或文檔。

希望能得到一些幫助或指向某些文檔或教程。

=================================

更新的代碼

嗨,我改變了代碼,以嘗試提供的樣本相匹配。 代碼現在看起來像下面我放在一個循環計數器,看看發生了什麼事,為什麼崩潰。

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 ....所以我在代碼中做到了這一點,它的工作原理,但不知道如果這是安全的,因為這不是定義為一個數組,即使它作為一個數組返回。




Links