Swift 如何为使用 Firebase 投票的用户添加 5 星评分

Posted

技术标签:

【中文标题】Swift 如何为使用 Firebase 投票的用户添加 5 星评分【英文标题】:Swift how to add 5 star ratings for users to vote using Firebase 【发布时间】:2018-08-25 20:18:59 【问题描述】:

我正在 Swift 中创建一个餐厅评级应用程序,它允许其用户以 5 星评级标准对餐厅进行评级(就像 Zomato 和 Yelp 一样)。 我将使用 Firebase 存储每个用户对特定餐厅的评分,然后取用户评分的平均值并将其显示在应用程序中。每个tableview单元格都会对应一个星级(每个tableview单元格对应一个餐厅)。

但是我深深地陷入了这个项目。我不知道如何将用户的评分添加到数据库中。我的应用不需要用户注册或登录页面,用户可以直接评价餐厅。话虽如此,我如何确保用户只能为一家餐厅投票一次?我会很感激任何帮助!提前谢谢你。

到目前为止,这是我的代码:

var starsRating = 0
var starsEmptyPicName = "star" // can change to empty star picture name
var starsFilledPicName = "starfill" // can change to filled star picture name
override func draw(_ rect: CGRect) 
let starButtons = self.subviews.filter$0 is UIButton
var starTag = 1
for button in starButtons 
    if let button = button as? UIButton
        button.setImage(UIImage(named: starsEmptyPicName), for: .normal)
        button.addTarget(self, action: #selector(self.pressed(sender:)), for: .touchUpInside)
        button.tag = starTag
        starTag = starTag + 1
    

setStarsRating(rating:starsRating)


func setStarsRating(rating:Int)
self.starsRating = rating
let stackSubViews = self.subviews.filter$0 is UIButton
for subView in stackSubViews 
    if let button = subView as? UIButton
        if button.tag > starsRating 
            button.setImage(UIImage(named: starsEmptyPicName), for: .normal)
        else
            button.setImage(UIImage(named: starsFilledPicName), for: .normal)
        
    
  
 

@objc func pressed(sender: UIButton) 
    setStarsRating(rating: sender.tag)

 
 

这是我的 tableview 函数:

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
 return identifiers.count //identifiers is my big restaurants array




 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

        let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "CellThree")
        cell.textLabel!.text = identifiers[indexPath.row]
        return cell
    

【问题讨论】:

这是问题我的应用不需要用户注册或登录页面。如果没有用户登录或某种身份验证,就无法跟踪它。应用程序需要知道谁在投票并将该数据存储在 /already_voted/ 节点中。然后查看该用户是否已经在代码中投票,或者如果他们已经投票,则利用 Firebase 规则拒绝写入。您可以使用Anonymous Authentication 来获得一些可追溯性,但这并不是一个万无一失的方法。最好创建用户并存储他们的 uid。 【参考方案1】:

如果用户已经投票,我会使用 CoreData 来保存。

    当用户对其中一家餐厅进行评分时,只需在核心数据中使用该餐厅的名称或 ID 创建一条新记录。

    在每次投票之前,我都应该检查数据是否存在。如果没有,用户可以投票。

【讨论】:

虽然 CoreData 非常强大,但在这个用例中,它有点像使用大炮杀死苍蝇。为什么要增加大量开销来存储单个投票,该投票可以轻松存储在 plist 甚至 userDefaults 中作为几个字节(继续阅读)。更重要的是 - 这是真正的问题 - 投票只会存储在该设备上。如果用户有多个设备(就像我们中的许多人一样),他们可以一遍又一遍地投票 - 如果您考虑一下,他们可以在线发布他们的登录信息,任何看到它的人都可以登录他的帐户并投票。跨度> @Jay 你说得对,我的想法是在没有用户身份验证的情况下这样做,但最好的解决方案是某种注册系统。

以上是关于Swift 如何为使用 Firebase 投票的用户添加 5 星评分的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Firebase 项目配置动态链接?

如何为 Firebase (Kotlin) 创建自定义身份验证

如何为上传到 Firebase 存储的文件生成访问令牌?

如何为 Firebase 取消部署 Cloud Functions?

使用 Firebase 的本地通知

如何为firebase字段添加价值