【问题标题】:How to Update CollectionView Model with Firebase?如何使用 Firebase 更新 CollectionView 模型?
【发布时间】:2019-03-21 11:29:52
【问题描述】:

我正在尝试使用包含数据的 firebase snap 来初始化我的 Collection View Model,该模型包含 [Users] 列表。

这里是集合视图模型代码:

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 获取了一组用户,但是我的集合视图不会更新。

我的问题是我应该如何更新我的 Collection View Model 和 Fetching Function,以便它可以从 Firebase 获取数据并正确填充 Collection View?

【问题讨论】:

    标签: swift firebase firebase-realtime-database uicollectionview


    【解决方案1】:

    所以问题出在我的目标节点上。删除了“child("users")”表单获取功能,并以 uid 为目标整个用户节点。然后我在将它投射到 [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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2016-05-31
      • 1970-01-01
      • 2015-02-27
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多