Javascript 在uitableview单元格中显示项目的分级

Javascript 在uitableview单元格中显示项目的分级,javascript,ios,xml,json,parse-platform,Javascript,Ios,Xml,Json,Parse Platform,我目前正在开发一个iOS应用程序,它在UITableView中显示30个菜单项,用户可以在用户点击单元格时显示的详细信息页面上的5次启动中对这些项进行评分 现在在单元格中,当前只是项目的标题,现在我想做的是将项目的标题和项目的当前平均评级设置在标题下方。现在我知道了如何创建单元格,但我很难以有效的方式获取电影当前评级的数据 我目前正在使用Parse.com作为我的后端。现在,当用户提交评级时,它会在名为Ratings的解析中保存到我的类中。并保存项目的标题和给定的星星数 现在,我正试图想出最有效

我目前正在开发一个iOS应用程序,它在UITableView中显示30个菜单项,用户可以在用户点击单元格时显示的详细信息页面上的5次启动中对这些项进行评分

现在在单元格中,当前只是项目的标题,现在我想做的是将项目的标题和项目的当前平均评级设置在标题下方。现在我知道了如何创建单元格,但我很难以有效的方式获取电影当前评级的数据

我目前正在使用Parse.com作为我的后端。现在,当用户提交评级时,它会在名为Ratings的解析中保存到我的类中。并保存项目的标题和给定的星星数

现在,我正试图想出最有效的方法来获取项目的平均星星数,并将其放入UITableViewCell。首先,我考虑执行一个云代码函数,该函数将查询所有30个项目,并对评级进行平均,就像parse.com文档中所做的那样

这里的问题是,有30个或更多的项,然后每个查询使用一个API请求,该请求很快就会到达高位。所以我排除了这个选择。另一种方法是一次只显示5个项目,然后在用户向下滚动时加载下一个项目5,但用户通常会非常快速地滚动多个项目,并且仍然会查看菜单上的所有30个项目,因此这并不能解决我的问题

现在我也有了自己的服务器,目前我在其中存储了一些正在服务的项目。我在想,是否有一种方法可以生成xml文件或JSON,当用户保存一个项目时,我会保存它以进行解析。然后将其保存到这个文件中

这就是我的想法和我被困的地方。我会使用Parse.com Javascript SDK制作一个云代码作业,每天运行一次。我会让这个函数执行一个查询,检索最后一天保存到ratings类中的所有评分。这会给我所有的东西。现在我陷入了困境:如何从Parse.com SDK将这个文件放到我的服务器上,以及如何将新的评级保存到这个文件中

当然,我愿意接受所有其他方法的建议,以避免这种情况,并尽量减少我的API请求。我在想是否也可以使用Parse.com托管来托管xml或JSON文件

或者只是一种完全不同的方式,我没有提到

我知道这是一个很长的问题,我已经尽力解释了,如果你有任何问题,请提问

提前谢谢你的帮助。我真的很感激:)

编辑

我忘了提到的是,这些东西每天都在变化,我有多家餐厅,每家都有自己的东西,所以总共有30家。因此,当我在表视图中显示30个项目时,我不确定如何在两次查询中获得所有评分(使用额外的类,我是否仍然需要查询每个项目)

编辑2

好的,现在我有一个NSMutableArray,里面填充了评级,我从查询中得到了它。但是假设我的表视图中有“一”、“二”和“三”项。只有“一”和“三”被评分,然后我得到了这些项目的两个评分,如果在我的
cellForRowAtIndexPath:
方法中,我就这么做了。差不多

cell.rating = ratingsArray[indexRow.path];
那么第二项的评级应该是三分

你看到问题了吗?我怎样才能摆脱它呢


谢谢

您不需要云代码作业或其他任何东西。您只需创建另一个具有以下属性的类:
itemId
numberofvoices
averageRating
。当用户发布新评级时,请在其设备上执行以下操作:

averageRating = (averageRating*numberOfVotes + userVote) / (numberOfVotes+1)
numberOfVotes++
并将这两个值存储在云中。当您需要显示平均评分时,只需获取项目的
averageRating

编辑

当我提到一个额外的类时,我的意思是你不需要在云中存储每个等级。您可以只使用一个类,并且只存储每个项目的平均评分和投票数。您可以通过如下方式使用单个API调用获取多个项目的平均评分:

NSArray *ids = @[@"1",
                 @"2",
                 @"3"];
[query whereKey:@"itemId" containedIn:ids];
如果您想存储每个用户的评分(检查用户是否已经对该特定项目进行了投票或在其他设备上显示了他的评分),您可以将其存储在iCloud容器中,这样,当用户进行投票时,您只需要一个API调用,当用户获取30个(或任意数量)项目时,您只需要一个调用


如果不需要支持iOS 7及更低版本,您还可以考虑使用CloudKit而不是Parse。allStars和Numberof评论。每次有人写评论

[根据用户选择的内容,按电影递增键“allStars”]

[movie incrementKey:“numberOfReviews”byAmount:1]

然后处理avg客户端。全明星/数字评论


这些应该是您的MovieObject上的属性,并且在查询电影时将包括这些属性,因为它们是原语而不是指针。因此,当您执行PFQuery时,如果成功,您将获得一个PFObjects数组。将tableViewDataArray设置为查询返回的数组。然后在cellForRowAtIndexPath中访问属性,比如(tableViewDataArray[indexPath.row]作为电影)。numberOfStars

这是一个有趣的问题,我也遇到了同样的问题。您可以尝试在Parse SDK中实现一个“RatingsAverage”类,该类具有以下属性:“菜单项”、“nbRatings”和“sumOfStars”。加载tableview的数据时,您必须执行两个API请求,一个用于项目,一个用于“RatingsAverage”,并在应用程序中执行配对RatingsAverage项目仅在为对象创建新评级时更新,但即使在这种情况下需要更多API请求,也会从tableview显示中保存更多API请求。是的,您可能需要另一个保存