Firebase初始化程序未初始化

时间:2020-06-29 03:58:07

标签: arrays firebase dictionary firebase-realtime-database

我有两个帮助程序类,这些类将Firebase数据库中的数据解析为可用的形式,这些形式可以在表视图中显示。 我正在尝试获取从Firebase检索的数据的快照并将其传递到PostData和PostSnapshot对象。从Firebase检索数据,但是我的初始化程序从未设置过,这意味着PostData数组(posts)始终为零。令人困惑的是,它在iOS 13之前就可以使用了,但这并不是任何可依赖于OS的代码,它只是一个围绕字典移动的类。

这是两个类和用法示例:

struct PostData {
    
    let postId: String
    let username: String
    let message: String
    let date: Date
    let profileImageURL: String
    let comments: [String: Any]
    let likes: [String: Any]
    let repostedId:String
    let cellType: String
    let repostCount: [String:String] 
    
    init?(postId: String, dict: [String: Any]) {
        self.postId = postId
        
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +zzzz"
        
        guard let username = dict["username"] as? String,
            let message = dict["message"] as? String,
            let dateString = dict["date"] as? String,
            let date = dateFormatter.date(from: dateString),
            let profileImageURL = dict["profileImageURL"] as? String,
            let likes = dict["likes"] as? [String: Any],
            let comments = dict["likes"] as? [String: Any],
            let repostedId = dict["repostedId"] as? String,
            let cellType = dict["cellType"] as? String,
            let repostCount = dict["repostCount"] as? [String:String]
            else { return nil }

        self.username = username
        self.message = message
        self.date = date
        self.profileImageURL = profileImageURL
        self.likes = likes
        self.comments = comments
        self.repostedId = repostedId
        self.cellType = cellType
        self.repostCount = repostCount
    }
}

和第二(2):

struct PostsSnapshot {
    let posts: [PostData]

    init?(with snapshot: DataSnapshot) {
        var posts = [PostData]()
        guard let snapDict = snapshot.value as? [String: [String: Any]] else { return nil }
        for snap in snapDict {
            guard let post = PostData(postId: snap.key, dict: snap.value) else { continue }
            posts.append(post)
        }
        self.posts = posts
    }
}

用法(3):

 var posts = [PostData]()


Database.database().reference().child("/\(UserData().mySchool)/posts").observe(.value, with: { (snapshot) in
                guard let postsSnapshot = PostsSnapshot(with: snapshot) else { return }
                self.posts = postsSnapshot.posts
                self.posts.sort(by: { $0.date.compare($1.date) == .orderedDescending })
                })
       self.tableView.reloadData()
        

在我的问题开始之前 ,以上代码将初始化数组postsvar posts = [PostData]()),以便您可以使用.message或要在表视图中使用的.username值。现在,无论我如何调试它,posts数组始终为零。 Firebase中的数据结构没有改变。我相信,与我初次做此操作相比,唯一改变的是操作系统,但这将如何影响两个类和一个表视图? 值得一提的是,Firebase中的 并非每个 数据对象都具有注释,顶,cellType或repostCount。我不确定是否会导致else { return nil }中的PostData返回并且不使用该数据...但是,每个帖子确实都有日期,消息,用户名,profURL和postId。 行:self.posts = postsSnapshot.posts通常传输数据,但是由于某种原因现在不传输数据。最后,我可以从初始快照中打印数据,并且可以在调试器中看到它,但不会初始化PostData数组。

谢谢!

0 个答案:

没有答案