簡體   English   中英

iOS:如何獲取和改組存儲在Firebase的childnode中的用戶的autoID數據?

[英]iOS: How to get and shuffle autoID data of users stored in childnode of firebase?

目前,我的數據在firebase中的結構如下:

圖片:Firebase結構

我想從以下選項卡的子節點中獲取隨機的autoID,並以多選格式將其顯示為選項,使其看起來像這樣(其中選項A,B,C,D是隨機的,但不相同):

圖片:應用外觀

我是Swift和Firebase的新手,所以想知道您是否可以提供我可以編寫的代碼來幫助我:

  1. 輸入顯示用戶關注誰的子節點

  2. 從列表中獲取4個隨機AutoID,並將其顯示為選項A,B,C,D

  3. 允許選項為UIButtons(或類似按鈕),以便我可以將此屏幕發送給被選中的用戶(作為通知)

  4. 在UIImageview上顯示4個用戶的個人資料圖片(profileImageUrl),以便您可以滾動瀏覽它們(-這是一個額外的步驟,但也希望能獲得幫助)

我希望這是有道理的,

在此先感謝:)

問題中有幾個問題,讓我們解決一個問題。

如何從Firebase實時數據庫中選擇隨機節點。 好吧,您不可以使用Firebase API來執行此操作,因為Firebase不提供該功能。 但是,您仍然可以這樣做。

首先讓我們從一個典型的用戶節點開始

users
  uid_0
    name: "Frank"
  uid_1
    name: "Leroy"
  uid_2
    name: "Henry"
  uid_3
    name: "Fred"

因此,如果這是用戶節點,則可以將其用於此解決方案。 但是,許多用戶節點中還存儲着許多其他數據-選擇隨機節點我們並不關心這些數據。 我們要做的是創建另一個僅包含節點密鑰的節點-即使有成千上萬的用戶,這也將保持很小

user_keys
   uid_0: true
   uid_1: true
   uid_2: true
   uid_3: true

然后,要選擇一個隨機節點,我們使用.value加載所有用戶密鑰,對其進行迭代以將密鑰加載到數組中,然后使用Swift 4隨機數生成器選擇一些要加載到另一個數組中的密鑰。

然后,我們遍歷該數組以從Firebase獲取實際的用戶節點。 我們也不想重復,因此當我們從數組中選擇節點時,我們將其刪除,因此不會再次選擇它們。 這是一個選擇3個隨機節點,檢索用戶數據並打印用戶名的功能。

func getThreeRandomNodesAndPrintUserName() {

    var myKeyArray = [String]()

    let ref = self.ref.child("user_keys")

    //retreives all nodes in the user_keys node
    ref.observeSingleEvent(of: .value, with: { snapshot in

        for child in snapshot.children { //build the array of keys
            let snap = child as! DataSnapshot
            let key = snap.key
            myKeyArray.append(key)
        }

        var randomKeyArray = [String]()

        for _ in 0...2 { //will iterate three times
            let count = myKeyArray.count //get the number of elements
            let randomInt = Int.random(in: 0..<count) //get a random index for the array
            let randomUserKey = myKeyArray[randomInt]
            randomKeyArray.append(randomUserKey)
            myKeyArray.remove(at: randomInt) //remove that object so it's not selected again
        }

        let numberOfKeys = randomKeyArray.count

        for i in 0..<numberOfKeys {
            let thisUserKey = randomKeyArray[i]
            let userRef = self.ref.child("users").child(thisUserKey)
            userRef.observeSingleEvent(of: .value, with: { snapshot in
                let name = snapshot.childSnapshot(forPath: "name").value as! String
                print(name)
            })
        }
    })
}

然后只需調用該函數即可打印三個隨機用戶名

self.getThreeRandomNodesAndPrintUserName()

和第一次運行的輸出

Fred
Frank
Henry

然后第二輪

Henry
Leroy
Fred

等等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM