Firebase Observer Event Type












0















I’m trying to modify code written a by a previous programmer. He wrote a getPostFromFirebase() function where it updates the tableview when 1) the app loads up due to it’s presence in viewDidLoad and 2) when there is a new post add by a user. The problem is that he used a .observe(.childAdded) event type which means when a post is deleted or modified, the tableView will not update(my end goal to do). When I change .childAdded to .value, the current data doesn’t get loaded upon launch. I’ve been banging my head against the wall to figure out a if let statement to add a .value event type so the view can refresh after any change(if that’s even possible). I’m familiar with Firebase RT DB hence how I was able to ID the observer issue but I’m no where near close to as good as I’d like to be so any help is appreciated.



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)")
}
}
}


Edit:
Thanks to Franks help I was able to implement his suggestion and added a .removeAll() to remove the current state and have the view append a fresh snapshot. Whether a post is added or deleted, the view now updates as I'd like it to do.



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)")
}
}
}
}









share|improve this question





























    0















    I’m trying to modify code written a by a previous programmer. He wrote a getPostFromFirebase() function where it updates the tableview when 1) the app loads up due to it’s presence in viewDidLoad and 2) when there is a new post add by a user. The problem is that he used a .observe(.childAdded) event type which means when a post is deleted or modified, the tableView will not update(my end goal to do). When I change .childAdded to .value, the current data doesn’t get loaded upon launch. I’ve been banging my head against the wall to figure out a if let statement to add a .value event type so the view can refresh after any change(if that’s even possible). I’m familiar with Firebase RT DB hence how I was able to ID the observer issue but I’m no where near close to as good as I’d like to be so any help is appreciated.



    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)")
    }
    }
    }


    Edit:
    Thanks to Franks help I was able to implement his suggestion and added a .removeAll() to remove the current state and have the view append a fresh snapshot. Whether a post is added or deleted, the view now updates as I'd like it to do.



    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)")
    }
    }
    }
    }









    share|improve this question



























      0












      0








      0








      I’m trying to modify code written a by a previous programmer. He wrote a getPostFromFirebase() function where it updates the tableview when 1) the app loads up due to it’s presence in viewDidLoad and 2) when there is a new post add by a user. The problem is that he used a .observe(.childAdded) event type which means when a post is deleted or modified, the tableView will not update(my end goal to do). When I change .childAdded to .value, the current data doesn’t get loaded upon launch. I’ve been banging my head against the wall to figure out a if let statement to add a .value event type so the view can refresh after any change(if that’s even possible). I’m familiar with Firebase RT DB hence how I was able to ID the observer issue but I’m no where near close to as good as I’d like to be so any help is appreciated.



      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)")
      }
      }
      }


      Edit:
      Thanks to Franks help I was able to implement his suggestion and added a .removeAll() to remove the current state and have the view append a fresh snapshot. Whether a post is added or deleted, the view now updates as I'd like it to do.



      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)")
      }
      }
      }
      }









      share|improve this question
















      I’m trying to modify code written a by a previous programmer. He wrote a getPostFromFirebase() function where it updates the tableview when 1) the app loads up due to it’s presence in viewDidLoad and 2) when there is a new post add by a user. The problem is that he used a .observe(.childAdded) event type which means when a post is deleted or modified, the tableView will not update(my end goal to do). When I change .childAdded to .value, the current data doesn’t get loaded upon launch. I’ve been banging my head against the wall to figure out a if let statement to add a .value event type so the view can refresh after any change(if that’s even possible). I’m familiar with Firebase RT DB hence how I was able to ID the observer issue but I’m no where near close to as good as I’d like to be so any help is appreciated.



      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)")
      }
      }
      }


      Edit:
      Thanks to Franks help I was able to implement his suggestion and added a .removeAll() to remove the current state and have the view append a fresh snapshot. Whether a post is added or deleted, the view now updates as I'd like it to do.



      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)")
      }
      }
      }
      }






      ios swift firebase-realtime-database






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 26 '18 at 0:16







      Joe Vargas

















      asked Nov 24 '18 at 16:16









      Joe VargasJoe Vargas

      307




      307
























          1 Answer
          1






          active

          oldest

          votes


















          0














          The .child* events fire on child nodes of the location/query that you observe, while .value fires on the location/query itself. This means that the value you get is one level higher up in the JSON, and you'll need to loop over the results:



          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)")
          }
          }
          }


          Alternatively, you can listen to the .childChanged and .childRemoved events (in addition to .childAdded that you already have) and handle them separately. This may be better in cases where you need to update the UI efficiently, since it allows you to handle each individual case (new node, changed, node, removed node) in the most efficient way.






          share|improve this answer
























          • Frank, thank you so much!! I have edited my post implenting your suggestion.

            – Joe Vargas
            Nov 26 '18 at 0:18













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53460035%2ffirebase-observer-event-type%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          The .child* events fire on child nodes of the location/query that you observe, while .value fires on the location/query itself. This means that the value you get is one level higher up in the JSON, and you'll need to loop over the results:



          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)")
          }
          }
          }


          Alternatively, you can listen to the .childChanged and .childRemoved events (in addition to .childAdded that you already have) and handle them separately. This may be better in cases where you need to update the UI efficiently, since it allows you to handle each individual case (new node, changed, node, removed node) in the most efficient way.






          share|improve this answer
























          • Frank, thank you so much!! I have edited my post implenting your suggestion.

            – Joe Vargas
            Nov 26 '18 at 0:18


















          0














          The .child* events fire on child nodes of the location/query that you observe, while .value fires on the location/query itself. This means that the value you get is one level higher up in the JSON, and you'll need to loop over the results:



          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)")
          }
          }
          }


          Alternatively, you can listen to the .childChanged and .childRemoved events (in addition to .childAdded that you already have) and handle them separately. This may be better in cases where you need to update the UI efficiently, since it allows you to handle each individual case (new node, changed, node, removed node) in the most efficient way.






          share|improve this answer
























          • Frank, thank you so much!! I have edited my post implenting your suggestion.

            – Joe Vargas
            Nov 26 '18 at 0:18
















          0












          0








          0







          The .child* events fire on child nodes of the location/query that you observe, while .value fires on the location/query itself. This means that the value you get is one level higher up in the JSON, and you'll need to loop over the results:



          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)")
          }
          }
          }


          Alternatively, you can listen to the .childChanged and .childRemoved events (in addition to .childAdded that you already have) and handle them separately. This may be better in cases where you need to update the UI efficiently, since it allows you to handle each individual case (new node, changed, node, removed node) in the most efficient way.






          share|improve this answer













          The .child* events fire on child nodes of the location/query that you observe, while .value fires on the location/query itself. This means that the value you get is one level higher up in the JSON, and you'll need to loop over the results:



          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)")
          }
          }
          }


          Alternatively, you can listen to the .childChanged and .childRemoved events (in addition to .childAdded that you already have) and handle them separately. This may be better in cases where you need to update the UI efficiently, since it allows you to handle each individual case (new node, changed, node, removed node) in the most efficient way.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 24 '18 at 18:18









          Frank van PuffelenFrank van Puffelen

          230k28376400




          230k28376400













          • Frank, thank you so much!! I have edited my post implenting your suggestion.

            – Joe Vargas
            Nov 26 '18 at 0:18





















          • Frank, thank you so much!! I have edited my post implenting your suggestion.

            – Joe Vargas
            Nov 26 '18 at 0:18



















          Frank, thank you so much!! I have edited my post implenting your suggestion.

          – Joe Vargas
          Nov 26 '18 at 0:18







          Frank, thank you so much!! I have edited my post implenting your suggestion.

          – Joe Vargas
          Nov 26 '18 at 0:18




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53460035%2ffirebase-observer-event-type%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

          Calculate evaluation metrics using cross_val_predict sklearn

          Insert data from modal to MySQL (multiple modal on website)