【发布时间】:2020-11-15 02:33:27
【问题描述】:
我的目标是,当用户打开应用程序时,他们会看到该应用程序的每个用户的每篇帖子。我的数据树如下:
- posts
- UID
- postKey
--attributes
- users
- UID
- attributes
这是一个例子:
-posts
-74anqEXU8kQHVr7IKoO3N9NNqDh1
-MLzvs5VvXB_z7fhbh2p
created_at: 1605242945.969368
image_height: 414.6865671641791
image_url: "https://firebasestorage...."
-MLzvun01fNXNRbn7TPv
-MM7zGyZ7GbenhlisJUZ
-VGxqdzc2CkWWn39pa8xUofEWgNm2
-pNvGg84JR0TbXvS4XlX8KbfBasz2
-users
-74anqEXU8kQHVr7IKoO3N9NNqDh1
-VGxqdzc2CkWWn39pa8xUofEWgNm2
我知道我必须对所有帖子进行快照,然后将其显示在主控制器 (SearchViewController) 的 viewDidLoad() 中。我不知道如何显示所有帖子。
此代码用于显示当前用户的帖子,存储在名为 UserService.swift 的文件中:
static func posts(for user: User, completion: @escaping ([Post]) -> Void) {
let ref = Database.database().reference().child("posts").child(user.uid)
ref.observeSingleEvent(of: .value, with: { (snapshot) in
guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
return completion([])
}
let dispatchGroup = DispatchGroup()
let posts: [Post] = snapshot.reversed().compactMap {
guard let post = Post(snapshot: $0) else { return nil }
dispatchGroup.enter()
SaveService.isPostSaved(post) { (isSaved) in
post.isSaved = isSaved
dispatchGroup.leave()
}
return post
}
dispatchGroup.notify(queue: .main, execute: {
completion(posts)
})
})
}
然后在 SearchViewController 的 ViewDidLoad() 中:
UserService.posts(for: User.current) { (posts) in
self.posts = posts
self.tableView.reloadData()
}
但是我如何为所有帖子执行此操作。当我尝试以下操作时,它不会让我指定随机用户:
let ref = Database.database().reference().child("posts").child(User)
知道我可以在“.child(User”框中添加什么来完成这项工作吗?或者如何创建一个 for 循环来正确迭代?
*编辑
这是有效的:
static func allPosts(completion: @escaping ([Post]) -> Void) {
let ref = Database.database().reference().child("posts")
ref.observeSingleEvent(of: .value, with: { (snapshot) in
var postsArray = [Post]()
for userSnapshot in snapshot.children {
guard let snapshot = (userSnapshot as AnyObject).children.allObjects as? [DataSnapshot] else {
return completion([])
}
let dispatchGroup = DispatchGroup()
let posts: [Post] = snapshot.reversed().compactMap {
guard let post = Post(snapshot: $0) else { return nil }
postsArray
postsArray.append(post)
dispatchGroup.enter()
SaveService.isPostSaved(post) { (isSaved) in
post.isSaved = isSaved
dispatchGroup.leave()
}
return post
}
dispatchGroup.notify(queue: .main, execute: {
completion(postsArray)
})
}
})
}
【问题讨论】:
标签: swift firebase firebase-realtime-database snapshot