首页 > 解决方案 > Firebase observe.value 不附加数组

问题描述

我有一个我试图调用的函数,它从firebase收集我的所有用户,然后通过查看每个用户并检查一个子节点将它们分成两组。例如,如果子节点是一个,它们将被放入第一组。如果他们的子节点是两个,那么他们将被放入第 2 组。这是我正在使用的当前代码。

var allUsersArray = [User]()
var macroUsersArray = [User]()
var microUsersArray = [User]()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        loadAllUsersAndPopulateArray()
    }

func loadAllUsersAndPopulateArray() {
    let ref = Database.database().reference().child("Users")
    ref.observeSingleEvent(of: .value, with: { snapshot in
        let allUsersSnapshot = snapshot.children.allObjects as! [DataSnapshot]
        for userSnap in allUsersSnapshot {
            let user = User(from: userSnap)
            self.allUsersArray.append(user!)
        }
        self.macroUsersArray = self.allUsersArray.filter { $0.Tag == "Macro" }
        self.microUsersArray = self.allUsersArray.filter { $0.Tag == "Micro" }

       // print(A)     
       print(self.allUsersArray)       

        self.observeChangeInUserProperty()
    })

       //print(B)
       print(self.allUsersArray)

}

func observeChangeInUserProperty() {
    let ref = Database.database().reference().child("Users")
    ref.observe(.childChanged, with: { snapshot in
        let key = snapshot.key

        let tag = snapshot.childSnapshot(forPath: "Tag").value as! String // ! = never optional
        //get the user from the allUsersArray by its key
        if let user = self.allUsersArray.first(where: { $0.Tag == key }) {
            if user.Tag != tag { //if the tag changed, handle it
                user.Tag = tag //update the allUsersArray
                if tag == "Macro" { //if the new tag is Macro remove the user from the Micro array
                    if let userIndex = self.microUsersArray.firstIndex(where: { $0.Tag == key }) {
                        self.microUsersArray.remove(at: userIndex)
                        self.macroUsersArray.append(user) //add user to macro array
                    }
                } else { //new type is micro so remove from macro array
                    if let userIndex = self.macroUsersArray.firstIndex(where: { $0.Tag == key }) {
                        self.macroUsersArray.remove(at: userIndex)
                        self.microUsersArray.append(user)
                    }
                }
                //reload the tableviews to reflect the changes
                self.tableView.reloadData()
                self.microTableView.reloadData()

            }
        }
    })
}

这是用户类的样子:

import UIKit
import Firebase

class User: NSObject {
    var Name: String?
    var Email: String?
    var UID: String?
    var Tag: String?

init?(from snapshot: DataSnapshot) {

        let dictionary = snapshot.value as? [String: Any]
    
        self.Name = dictionary!["Name"] as? String
        self.Email = dictionary!["Email"] as? String
        self.UID = dictionary!["UID"] as? String
        self.Tag = dictionary!["Tag"] as? String
        
    
    }

 }

每当我从 loadAllUsersAndPopulateArray() 中的 ref.observeSingleEvent{} 中打印(self.allUsersArray)时,我都可以看到用户列表。当我在 func loadAllUsersAndPopulateArray() 中移动 print(self.allUsersArray) 时,我得到一个空数组。当我在 viewDidLoad() 中打印数组时,我也会得到空数组。我真的需要弄清楚如何永久附加这些数组,这样我就可以开始设置表了。

编辑:

每当我 print(A) 时,我都会得到相应用户的数组。

每当我 print(B) 得到空数组时,这意味着数组仍未被附加。

标签: swiftfirebase-realtime-database

解决方案


推荐阅读