Если разрешены повторные лайки, как вы добавляете 1 к количеству лайков в случаях, когда новая запись «Нравится» заменяет старую и не учитывается?

#swift #firebase #firebase-realtime-database #snapshot

#swift #firebase #firebase-realtime-database #снимок

Вопрос:

Итак, есть дочерний элемент, который действует так в db:

 User A
 peopleWhoLike2: ///all those who liked user A
  User B: 1603993939.  //// UserB liked A: Timestamp of the like. Repeats get replaced
 TodayLikeCount: 1
 
  

Теперь в некоторых случаях разрешены повторные лайки (поэтому новый заменяет старый в дочернем элементе peopleWhoLike2). Это повлияло бы на «TodayLikeCount». Ниже показано, как это работает для случаев, когда пользователь B еще не поставил лайк пользователю A. Как вы можете добавить еще один, если пользователь B уже поставил лайк пользователю A (для учета замены записи в БД)?

Дополнительное примечание: в приведенном ниже коде первый сегмент обновляет общее количество лайков. Второй сегмент обращается к TodayLikeCount . 2-й вопрос касается вопроса. В двух словах, если запись пользователя B, которому нравится пользователь A, уже существует, а пользователю B нравится пользователь A, запись DB просто заменяется, а затем количество не становится еще одним. В этом экземпляре она должна добавить 1 к TodayLikeCount .

Что касается того, что делает сегмент 1 (у него нет проблем, но сегмент 2 находится внутри него, поэтому я добавил его). Сегмент 2 обновляет общее количество лайков, и это делается путем подсчета дочерних элементов, похожих на людей, где замена не происходит — следовательно, проблем нет

 //Segment 1
let keyToPost = ref.child("likes").childByAutoId().key
ref.child("people").child(self.postID).observeSingleEvent(of: .value, with:  {(snapshot) in
   if let people = snapshot.value as? [String: AnyObject] {
   let updateLikes: [String: Any] = ["peopleWhoLike/(keyToPost)" : Auth.auth().currentUser!.uid]
      ref.child("people").child(self.postID).updateChildValues(updateLikes, withCompletionBlock: { (error, reff) in

    if error == nil {
       ref.child("people").child(self.postID).observeSingleEvent(of: .value, with: { (snap) in
         if let properties = snap.value as?[String: AnyObject]{
            if let likes = properties["peopleWhoLike"] as? [String : AnyObject] {
            let count = likes.count
            let update = ["likes" : count]
            ref.child("people").child(self.postID).updateChildValues(update)                                           
}                      
}                
})
    
///Segment 2
**let thisUserRef1 = ref.child("people").child(self.postID)
let myPeopleRef1 = thisUserRef1.child("peopleWhoLike2")
myPeopleRef1.observe(DataEventType.value, with: { snapshot in

let peopleArray = snapshot.children.allObjects as! [DataSnapshot]
let filteredResults = peopleArray.filter { person in
    let personUid = person.value as! Int
    let coordSnap12 = personUid
    print("kjk", coordSnap12 )
    let date = Date(timeIntervalSince1970: TimeInterval(coordSnap12)/1000.0)
    //let secondsInDay = 86400
    
    return Calendar.current.isDateInToday(date)
    
}

print(filteredResults, "ppp")
let countb = filteredResults.compactMap({$0}).count
print(countb, "kji")
let updateLikes1 = ["TodayLikeCount" : countb]
ref.child("people").child(self.postID).updateChildValues(updateLikes1)
})
}
})   
}   
})**
  

Комментарии:

1. Пожалуйста, отформатируйте свой код, чтобы удалить лишние отступы и лишние пустые строки

2. Переходя к сути, это может привести к путанице с «TodayLikeCount» — это проблема. Если у пользователя уже есть существующий узел, просто обновите его новой меткой времени, не меняйте TodayLikeCount . Если у пользователя нет существующего узла, добавьте его и обновите TodayLikeCount . Самое интересное, что здесь вы можете наблюдать события .ChildAdded для обновления количества — .ChildAdded будет срабатывать только в том случае, если добавлен дочерний элемент.

3. @Jay спасибо. Я исправил это сегодня утром, сделал именно это

4. Отлично! Означает ли это, что она исправила проблему?

5. Да. Спасибо.