如何限制Firebase的星数?

时间:2018-08-12 19:05:32

标签: ios swift firebase firebase-realtime-database

我正在编写带有通用供稿的匿名社交媒体应用。我想将帖子的喜欢数限制为每个用户一个,但是我不知道如何限制每个用户的喜欢数。这是我当前的代码:

    class story
var text = ""
var numberoflikes = 0
var user = Auth.auth().currentuser!

iboulet weak var : likebutton : uibutton
iboulet weak var: storylabel : uilabel

var story: story! {
didSet {
storylabel.text = story.text
likebutton.setTitle(" /("story.numberoflikes)", for: []}}
}

ibaction func likedidtouch: (_ sender: AnyObject) {
story.like()
llikebutton.settitle(" \(story.numberoflikes)", for: []}}
}}

extension story {
func like() {
if like() set user = false
else set user = true
numberoflikes += 1 
ref.child("numberoflikes").setValue(numberoflikes
}
}

为了将每个用户的喜欢限制为一个,我需要更改什么?

我的数据库模型,我有:
“ stories”>“文本”,“喜欢数目”

我真的很感谢您可以为此提供的任何帮助

2 个答案:

答案 0 :(得分:0)

我最近创建了一个类似的平台。我所做的就是将用户投票也存储在数据库中。

vote

在每个用户的节点内,他们具有每个帖子的投票值。 因此,假设您希望按钮的突出显示如下。您将必须从树中获取该用户的postVotes节点,在postVotes对象上循环并根据每个帖子的投票值分配亮点。

enter image description here

最后,您应该将用户在防火墙上保留的旧投票与新投票进行比较。

let incrementBy
let userVote

if (currentVote === newVote * -1) {
  incrementBy = newVote * 2
  userVote = newVote
}
else if(currentVote === 0) {
  incrementBy = newVote
  userVote= newVote
}
else {
  incrementBy = newVote * -1
  userVote= 0
}

// update your totalvote value on your firebase by incrementBy
// swap your firebase uservote value on that post with userVote

答案 1 :(得分:0)

有很多方法可以解决这个问题,但是这里有两种。无论哪种方式,都从此Firebase结构开始。

posts
  some_post_id
     post: "I like pizza"
     votes
      uid_0: true
      uid_2: true
      uid_5: true

1)通过检查其用户Anonymous User Id(UID)是否已经存在来查看有投票权的用户是否已经投票

本质上,当用户对帖子投票时,捕获其uid并将其写入具有正确值(如果尚不存在)的votes节点。

在撰写之前,请检查他们是否已投票

let thisUid = Auth.auth().currentUser?.uid
let postsRef = self.ref.child("posts")
let refToCheck = postsRef.child("some_post_id").child("votes").child(thisUid!)

refToCheck.observeSingleEvent(of: .value, with: { snapshot in
    if snapshot.exists() {
        print("you already voted for this post")
    } else {
        print("no uid found, adding a vote")
        refToCheck.setValue(true)
    }
})

请注意,这需要进行错误检查,但可以正常工作。

2)使用Firebase规则允许仅在表决节点内不存在写uid(密钥)的操作。本质上,如果uid已经存在,它将拒绝写入。我更喜欢#1,但这是另一种选择。

如果您不熟悉规则,则有很多选择,因此请首先查看Firebase Rules Guide