我建议不要防止在客户端重复“喜欢”;正如你所描述的那样,它最终会过于详尽。您可以做两件事:
-
您可以通过如下构造数据库来防止重复:
{
"likes": {
"user1Key": {
"objectLikedKey1": true,
"objectLikedKey2": true
...
}
}
}
这样,数据结构默认会防止重复。把它想象成一套!
-
如果您的数据库结构不同,并且出于某种原因您需要这种方式,您可以使用规则来防止重复。 (我在这里假设一个随机结构,这样你就可以理解了)
{
"rules": {
".read": true,
"userLikes": {
"$user": {
".write": "!data.exists()"
}
}
}
}
这意味着只有在数据不存在时才能写入数据库。
更新:
在结构中为每个对象创建一个子对象,每个对象都包含“喜欢”该对象的所有用户的列表
{
"objects": {
"object1Key": {
"user1Key": true,
"user2Key": true
...
"timestamp": "2017-01-01 12:00:00 +0000"
}
}
}
如果您想检索某个用户喜欢的所有对象,第 (1) 点中的结构将很有用。如果要检索所有喜欢某个对象的用户,则应使用后一种结构。
如果您有某种类似于 Facebook 的新闻源表来加载帖子或对象,那么第二种方法是最好的,它还可以防止重复喜欢。您可能还想在表中实现某种分页机制,当用户滚动查看更多内容时,它会加载合理数量(比如 5 或 10 个)对象。每次检索对象页面时,遍历喜欢该对象的用户,并检查当前登录的用户是否是其中之一,如果是,请适当设置按钮的颜色。
如果您有很多活动,它会占用一些内存,但这是您目前最好的方法。我相信最节省内存的解决方案是在服务器而不是客户端的设备上循环遍历对象的喜欢过程,因此无论用户是否喜欢它,您都可以检索一个布尔值,但 Firebase 不提供该选项。
实施提示:
-如果你真的要使用上面推荐的分页机制,你可以使用下面的方法来检查你是否需要加载更多的项目:
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let lastElement = yourDataSource.count - 1
if indexPath.row == lastElement {
// load more
}
}
-分页需要某种标记来设置应该检索哪些项目,因此您可能应该为添加到结构中的每个对象存储一个时间戳(以及喜欢该对象的用户列表,如上所示) .这个link有一个关于分页的详细答案。如果您熟悉queryOrderedByChild()、queryStartingAtValue() 和queryLimitedToFirst(),您将很容易理解,可能无需通过链接中的答案!