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