还没有弄清楚!...我试图显示Firebase中的数据,但是我的“ posts”变量不包含值,尽管快照包含3个值。我认为“我的帖子= snapshot.flatMap(Post.init)”出了问题。
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var posts = [Post]()
var userPostHandle: DatabaseHandle = 0
var userPostRef: DatabaseReference?
...
override func viewDidLoad() {
super.viewDidLoad()
...
// 2
userPostsHandle = UserService.observePosts { [weak self] (ref, posts) in
self?.userPostsRef = ref
self?.posts = posts
// 3
DispatchQueue.main.async {
self?.tableView.reloadData()
}
}
}
deinit {
// 4
userPostsRef?.removeObserver(withHandle: userPostsHandle)
}
}
(用户服务中名为observePosts的函数-尽管我之前测试的快照具有值,但帖子具有0个值)
static func observePosts(for user: User = User.current, withCompletion completion: @escaping (DatabaseReference, [Post]) -> Void) -> DatabaseHandle {
let ref = Database.database().reference().child("posts").child(user.username)
return ref.observe(.value, with: { (snapshot) in
guard let posts = Post(snapshot: snapshot) else {
return completion(ref, [])
}
let posts = snapshot.flatMap(Post.init)
completion(ref, posts)
})
}
答案 0 :(得分:0)
您可能必须分配数据源并委托给tableView
。
您可以通过编程或情节提要来实现。请通过程序检查以下内容。
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 71
// remove separators for empty cells
tableView.tableFooterView = UIView()
// 2
userPostsHandle = UserService.observePosts { [weak self] (ref, posts) in
self?.userPostsRef = ref
self?.posts = posts
// 3
DispatchQueue.main.async {
self?.tableView.reloadData()
}
}
self.tableView.delegate = self
self.tableView.datasource = self
}
答案 1 :(得分:0)
请尝试这个。您可以在异步中分配ref。
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.delegate = self
self.tableView.datasource = self
tableView.rowHeight = 71
// remove separators for empty cells
tableView.tableFooterView = UIView()
// 2
userPostsHandle = UserService.observePosts { [weak self] (ref, posts) in
// 3
DispatchQueue.main.async {
self?.userPostsRef = ref
self?.posts = posts
self?.tableView.reloadData()
}
}
}