Тип события Firebase Observer - PullRequest
       0

Тип события Firebase Observer

0 голосов
/ 24 ноября 2018

Я пытаюсь изменить код, написанный предыдущим программистом.Он написал функцию getPostFromFirebase(), в которой он обновляет представление таблицы, когда 1) приложение загружается из-за его присутствия в viewDidLoad и 2), когда пользователь добавляет новое сообщение.Проблема в том, что он использовал тип события .observe(.childAdded), что означает, что при удалении или изменении сообщения tableView не будет обновляться (моя конечная цель - сделать).Когда я изменяю .childAdded на .value, текущие данные не загружаются при запуске.Я ударился головой о стену, чтобы вычислить оператор if let для добавления типа события .value, чтобы представление могло обновляться после любого изменения (если это вообще возможно).Я знаком с Firebase RT DB, следовательно, как мне удалось идентифицировать проблему наблюдателя, но я далеко не так близко, как хотелось бы, поэтому любая помощь приветствуется.

func getPostFromFirebase() {
    let mostRecent = dbRef.lastestPostsQuery(count: 10)
    mostRecent.keepSynced(true)
    mostRecent.observe(.childAdded) { (snapshot: DataSnapshot) in

      /*parse method in the PostFetcher class 
      that returns the post data or an error by way of a tuple.*/

      let (post, error) = PostFetcher.parsePostSnapshot(snapshot: snapshot)  
      if let post = post {
        self.latestPosts.append(post)
        if let postId = post.postId { print("PostId = \(postId)") }
      }
      if let error = error {
        print("\(#function) - \(error)")
      }
    }
  }

Редактировать: Благодаря помощи Фрэнкса я смог реализовать его предложение и добавил .removeAll(), чтобы удалить текущее состояние и добавить в представление новый снимок.Независимо от того, добавлено или удалено сообщение, представление теперь обновляется так, как мне бы хотелось.

func getPostFromFirebase() {
    let mostRecent = dbRef.lastestPostsQuery(count: 10)
    mostRecent.keepSynced(true)
    mostRecent.observe(.value) { (snapshot: DataSnapshot) in
        self.latestPosts.removeAll()
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let (post, error) = PostFetcher.parsePostSnapshot(snapshot: child)
            if let post = post {
                self.latestPosts.append(post)
                self.tableView.reloadData()
                if let postId = post.postId { print("PostId = \(postId)") }
            }
            if let error = error {
                print("\(#function) - \(error)")
            }
        }
    }
}

1 Ответ

0 голосов
/ 24 ноября 2018

События .child* инициируют дочерние узлы местоположения / запроса, которые вы наблюдаете, а .value - самого местоположения / запроса.Это означает, что значение, которое вы получаете, на один уровень выше в JSON, и вам нужно будет зациклить результаты:

mostRecent.observe(.value) { (snapshot: DataSnapshot) in
  for child in snapshot.children.allObjects as! [DataSnapshot] {
    let (post, error) = PostFetcher.parsePostSnapshot(snapshot: child)  
    if let post = post {
      self.latestPosts.append(post)
      if let postId = post.postId { print("PostId = \(postId)") }
    }
    if let error = error {
      print("\(#function) - \(error)")
    }
  }
}

В качестве альтернативы, вы можете прослушать .childChanged и .childRemovedсобытия (в дополнение к .childAdded, что у вас уже есть) и обрабатывать их отдельно.Это может быть лучше в тех случаях, когда вам необходимо эффективно обновить пользовательский интерфейс, поскольку он позволяет вам обрабатывать каждый отдельный случай (новый узел, измененный, узел, удаленный узел) наиболее эффективным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...