快照包含值,但“ posts”变量不包含

时间:2019-01-07 05:30:14

标签: swift firebase-realtime-database viewcontroller

还没有弄清楚!...我试图显示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)
    })
}

2 个答案:

答案 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()
        }
    }

}