#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. Да. Спасибо.