Like feedback using firebase crash. Fast click like-remove like

Viewed 76

I have an application like instagram. It has feedback page.

When user likes some post, I add this like and feedback (with its own key (.childByAutoId) for this like.

static func add(_ newLike: LikeItem) {
  // add like id for user feedback implementation
  var like = newLike
  let likeRef = ref.child("/userslikes/" + newLike.userId + "/onposts/" + newLike.postId).childByAutoId()
  like.key = likeRef.key

  var updates: [String: Any?] = [
     "/userslikes/" + like.userId + "/onposts/" + like.postId: like.toAnyObject(),
     "/postslikes/" + like.postId + "/"         + like.userId: like.toAnyObject()
  ]

  if like.userId != like.postAddedByUserId { // dont add your own likes
     var likeForFeedBack = like.toAnyObject()
     likeForFeedBack["isViewed"] = false // when user will open feedback -> true
     updates.updateValue(likeForFeedBack, forKey: "/feedback/" + like.postAddedByUserId + "/" + like.key)
  }

  ref.updateChildValues(updates)
}

It's ok. And also I have remove function. It is going to like node, getting this like and feedbackId from this like. And then I make multi-part update.

static func remove(with userId: String, _ post: PostItem) {
  var updates: [String: Any?] = [
     "/userslikes/" + userId   + "/onposts/" + post.key: nil,
     "/postslikes/" + post.key + "/"         + userId:   nil
  ]

  // deleting from feedback node
  getLikeFromUser(id: userId, postId: post.key) { like in
     if like.userId != like.postAddedByUserId {
        updates.updateValue(nil, forKey: "/feedback/" + like.postAddedByUserId + "/" + like.key)
     }

     ref.updateChildValues(updates)
  }
}

static func getLikeFromUser(id: String, postId: String,
                           completion: @escaping (_ likeId: LikeItem) -> Void) {
  let refToLike = ref.child("/userslikes/" + id + "/onposts/" + postId)

  refToLike.observeSingleEvent(of: .value, with: { snapshot in
     let like = LikeItem(snapshot: snapshot)

     completion(like)
  })
}

So, when user taps "remove like" I have some delay (It is fetching like entity to get feedback id at this time).

And the problem: If I'm spamming like-removeLike button (like - remove like - l - rl - l - rl etc.), sometimes my feedback node is duplicating (with different keys ofc. It has not removed old node) and sometimes it is not adding (in this situation it is crashing if I try to remove it in the future).

How to fix it?

1 Answers
Related