我有一个应用程序,用户可以在该应用程序中点赞应用程序中的内容,出于显而易见的原因,用户不应该对某个内容点赞两次。为了确保这一点,当用户喜欢某样东西时,我将文章的键存储在数据库的列表中。问题是在加载 TableView 时检查用户是否已经喜欢该文章的最有效方法是什么。
但在那之后我需要建议,我认为我有两种方法可以做到这一点。
我可以在应用程序启动时加载整个列表,然后在加载 TableView 时我可以检查文章键是否在已点赞键列表中。 (这就是我的倾向)唯一的问题是当用户喜欢说 1000 件事时,每次应用程序启动时,它都必须从 Firebase 下载 1000 行,这很多,另一个问题意味着文章可以' 开始加载,直到此查询完成。
将文章键传递到单元格中,然后在数据库中查询该键以查看它是否存在,我担心这个的原因是因为这意味着每次单元格加载时都会有一个查询,这很多查询和网络事件。我不确定这是否会成为问题。
提前致谢! :)
最佳答案
我建议不要阻止客户端重复“喜欢”;正如您所描述的那样,它最终会变得过于详尽。您可以做两件事:
您可以通过按如下方式构建数据库来防止重复:
{
"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)的对象。每次检索对象页面时,遍历喜欢该对象的用户并检查当前登录的用户是否是其中之一,如果是,则适本地设置按钮的颜色。
如果您有很多事件,它会占用一些内存,但这是目前最好的方法。我相信最有效的内存解决方案是在服务器而不是客户端设备上循环遍历对象的喜欢过程,这样您就可以检索一个 bool 值,无论用户是否喜欢它,但 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(),您会很容易理解这个想法,也许不需要浏览链接中的答案!
关于swift - Firebase - 以有效的方式管理用户喜欢 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41393351/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac