首页 > 解决方案 > 如何使用 Firebase 更新 CollectionView 模型?

问题描述

我正在尝试初始化我的集合视图模型,该模型包含一个 [Users] 列表,其中包含一个包含数据的 firebase snap。

这是集合视图模型代码:

typealias JSON = [String:Any]

    class HomeDataSource: Datasource {
        var users: [User]
        init?(with snapshot:DataSnapshot) {
            var users = [User]()
            guard let snapDict = snapshot.value as? [String: [String:Any]] else {return nil}

            for snap in snapDict {
                guard let user = User(dict: snap.value) else {continue}
                users.append(user)
            }

            self.users = users
        }
    }

用户模型:

struct User {
    let name: String
    let username: String

    init?(dict: JSON) {
        guard let name = dict["name"] as? String,
                let email = dict["email"] as? String
        else {return nil}
        self.name = name
        self.username = email
    }
}

Firebase 快照:

Snap (users) {
    8CVeHMNHI6hZAWj1zhGHEjPwYYz1 =     {
        email = "Silviu@isidors.sjsj";
        name = Bshdjdj;
    };
    9CuqgR4Es7TOPPJQEpSnQXlfYnm1 =     {
        email = "Test@silviu.com";
        name = "Test@silviu.com";
    };
    DBqGWlpdJKME570euqUz2rqI5Z83 =     {
        email = "Test@test.test";
        name = Test;
   };
} 

获取功能:

func fetchUser() {
    let ref = Database.database().reference().child("users")
    ref.observe(.childAdded, with: { (snapshot) in
        let user = User(dict: snapshot.value as! JSON)
        self.users.append(user!)
        print(self.users)
        let new = HomeDataSource(with: snapshot)
        print(new)
        DispatchQueue.main.async(execute: {
            self.datasource = new
            self.collectionView?.reloadData()
        })
    }, withCancel: nil)
}

现在,我从 Firebase 获得了一系列用户,但是我的集合视图不会更新。

我的问题是我应该如何更新我的集合视图模型和获取函数,以便它可以从 Firebase 获取数据并正确填充集合视图?

标签: swiftfirebasefirebase-realtime-databaseuicollectionview

解决方案


所以问题是我的目标节点。删除“ child("users")”表单获取功能,并以 uids 为目标整个用户节点。然后我在将它投射到 [String:[String:Any]] 时循环了 snapshot.value,因为每个snapshot.value看起来像这样(key: "vijwUkzAlbgcqjAammfy0JuVMB33", value: ["name": Silviu, "email": Office@isidors.com])最后,我像这样更新了 HomeDataShource 类:

class HomeDataSource: Datasource {

var users: [User]

init(with snapshot:DataSnapshot) {
    var users = [User]()

    let snapDict = snapshot.value as? [String:[String:Any]]

    for snap in snapDict! {
        guard let user = User(snap: snap.value) else {continue}
        users.append(user)
    }
    self.users = users
}

推荐阅读