У меня есть социальное приложение, которое я хочу показать пользователю сообщения, которые понравились ему в последнее время, и которые были двумя последними людьми, которым понравился этот пост. Отображалось что-то вроде «Пользователю A и пользователю B понравились, а вашему посту понравились 31 человек», где 31 участнику понравилась эта публикация не так давно, как пользователю A и пользователю B, и эта запись c была самой последней публикацией пользователя, которая ему понравилась .
Я пытаюсь найти наилучший способ структурирования базы данных с учетом этих требований. Я думал, что сохраню метку времени lastLiked
, связанную с постом, в likeActivity
, а затем использую метку времени в качестве ключа для пользователей, которым понравился пост (см. Ниже).
"likeActivity" : {
"nIhx1SnChjapy4cbrD5sC1WIZXM2" : {
"-M0egnxw7TqEJoEwA0gG" : {
"lastLiked" : 1582337525620,
"userLikes" : {
"1582337525616" : "BmvRlWWuGRWApqFvtT8mXQlDWzz2",
"1582337525620" : "Ff0CxZhQzYVHuqbnsiOKwRAB01D2"
}
},
"-M0jMrisNrnB4usGeCaS" : {
"lastLiked" : 1582337525630,
"userLikes" : {
"1582337525630" : "Ff0CxZhQzYVHuqbnsiOKwRAB01D2"
}
},
"-M0jPBatN45YtfdyTXNM" : {
"lastLiked" : 1582337525616,
"userLikes" : {
"1582337525610" : "bz2E02wmmXQjVkxRF23T2SPkzSf2",
"1582337525616" : "WPOThFRRLDUCeJ8YVmyHFpGgnxI3"
}
}
}
}
Будет ли это наилучшим образом, учитывая мои требования сверху? Если это так, у меня возникла масса проблем с поиском их для моего приложения iOS, потому что когда я звоню snapshot.children.allObjects
, я получаю не только likes
, но и отметку времени lastLiked
. Как бы я переработал функцию observeActivity
для извлечения данных, упорядоченных по lastLiked
, а затем по timestamp
. Я прочитал документацию по заказу данных в Firebase, но я не уверен, как применить ее в моих обстоятельствах.
func observeActivity () {
guard let uid = Auth.auth().currentUser?.uid else {
return
}
let newActivity = DataService.ds.REF_LIKE_ACTIVITY.child("\(uid)")
newActivity.observe(.value, with: {(snapshot) in
self.posts = []
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot{
let postKey = snap.key
//self.posts.append(snap.key)
let userLikeData = newActivity.child("\(snap.key)").child("userLikes")
userLikeData.observe(.value, with: {(snapshot) in
if let newSnap = snapshot.children.allObjects as? [DataSnapshot] {
for valueSnap in newSnap {
//Users who have liked the post
print("SNAPTIVITY \(valueSnap.value!)")
let userId = valueSnap.value!
//self.userArray.append("\(userId)")
if self.activityDict["\(postKey)"] != nil {
self.activityDict["\(postKey)"]!.append("\(userId)")
} else {
self.activityDict["\(postKey)"] = ["\(userId)"]
}
}
let postData = DataService.ds.REF_POSTS.child(postKey)
postData.observe(.value, with: { (snapshot) in
if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
let key = snapshot.key
let post = Post(postKey: key, postData: postDict, isLiked: 0)
self.posts.append(post)
}
//self.feedTableView.reloadData()
self.activityTableView.reloadData()
})
}
})
}
}
})
}