Снимок содержит значения, но переменная "posts" не - PullRequest
0 голосов
/ 07 января 2019

Все еще не понял! ... Я пытаюсь показать данные из Firebase, но моя переменная "posts" не содержит значений, хотя снимок содержит 3 значения. Я думаю, что-то не так с моим "let posts = 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)
    }
}

(функция из пользовательской службы, называемая наблюдаемыми - у записей есть 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 голосов
/ 07 января 2019

Пожалуйста, попробуйте это. Вы можете назначить 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()
        }
    }

}
0 голосов
/ 07 января 2019

Возможно, вам придется назначить источник данных и делегата для вашего 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
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...