Можно ли ограничить количество лайков (от пользователя A до пользователя B) до одного в день или сеанс? - PullRequest
0 голосов
/ 11 октября 2019

Что у меня есть сейчас: страница, которая отображает все, что получил пользователь. Если кто-то продолжает нажимать кнопку «Мне нравится», на этой странице будет отображаться каждый лайк. Это слишком. Я хочу сделать так, чтобы, даже если кто-то постоянно нажимал кнопку «Мне нравится», отображался только один из них. Другими словами, мне нужен способ ограничить количество лайков, отображаемых (сделанных), до 1 в день или за сеанс.

Я бродил взад и вперед, пытаясь решить, стоит ли устанавливать ограничение, когда подобноенажата или когда отображается подобное (очевидно, на разных страницах для разных пользователей).

Вот код для страницы пользователя, который видит все подобные себе.

func printPersonInfo(uid: String) {
print(uid)
 let usersRef = Database.database().reference().child("people")
 let thisUser = usersRef.child(uid)
 thisUser.observeSingleEvent(of: .value, with: { snapshot in
 let photoPosts = snapshot.childSnapshot(forPath: "PhotoPosts").value as? String ?? "No PhotoPosts"
 let education = snapshot.childSnapshot(forPath: "Education").value as? String ?? "No Education"
  let whatIamConsideringBuying = snapshot.childSnapshot(forPath: "WhatIamConsideringBuying").value as? String ?? "No WhatIamConsideringBuying"
 print(photoPosts, education, whatIamConsideringBuying)
 let p = Usery(education: education, whatIamConsideringBuying: whatIamConsideringBuying, photoPosts: photoPosts)
 self.person.insert(p, at: 0)
 self.table.reloadData()

Вот еще несколько нисходящих

 public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell

    let immy = cell.viewWithTag(2) as! UIImageView

    let person1: Usery = person[indexPath.row]


    cell.lblName1.text = person1.education
    cell.lblgenre1.text = person1.whatIamConsideringBuying

    if let photoPosts = person1.photoPosts {
        let url = URL(string: photoPosts)
        immy.sd_setImage(with: url)
    }

    return cell

}

Это структура базы данных:

 "peeps" : {
    "5VbL3Adj7teM2KNJkF4GIexBJhE2" : {
      "Education" : "Yale",
      "PhotoPosts" :     "https://firebasestorage.googleapis.com/v0/b/daylike-2f938.appspot.com/o/images%2FPhotoPosts?alt=media&token=42d76567-ac42-4728-9914-1d7c2fa4d5e6",
      "WhatIamConsideringBuying" : "Twitter: Carla9",
      "caption1" : {
        "caption1" : 1570097725719,
        "keyToPost" : "-LqG6V0RVEyFNt9Zu9CE"
      },
      "likes" : 565,
      "peopleWhoLike" : {
        "-LmLjHwwGj1kt5qLM20X" : "NMNQYJ5z64fATK2MMs7m0ggHl0k2",
        "-LmLtlp5Sm900SV8xP4i" : "NMNQYJ5z64fATK2MMs7m0ggHl0k2",

Страница, на которой создается подобное, содержит функцию Pressed длякак нажата.

(ОБНОВЛЕНИЕ после ответа)

   let ref = Database.database().reference()
    let keyToPost = ref.child("likes").childByAutoId().key

    ref.child("people").child(self.postID).observeSingleEvent(of: .value, with:  {(snapshot) in

        if let people = snapshot.value as? [String: AnyObject] {
            let updateLikes: [String: Any] = ["peopleWhoLike/\(keyToPost)" : Auth.auth().currentUser!.uid]

            ref.child("people").child(self.postID).updateChildValues(updateLikes, withCompletionBlock: { (error, reff) in



                if error == nil {
                    ref.child("people").child(self.postID).observeSingleEvent(of: .value, with: { (snap) in
                        if let properties = snap.value as?[String: AnyObject]{
                            if let likes = properties["peopleWhoLike"] as? [String : AnyObject] {
                                let count = likes.count
                            let update = ["likes" : count]
                                ref.child("people").child(self.postID).updateChildValues(update)

дополнительный код

  let uid = Auth.auth().currentUser!.uid
    print("H", uid)
        let thisUserRef = Database.database().reference().child("people").child(uid)
        let myPeopleRef = thisUserRef.child("peopleWhoLike")
   myPeopleRef.observeSingleEvent(of: .value, with: { snapshot in
            let peopleArray = snapshot.children.allObjects as! [DataSnapshot]
            for person in peopleArray {
                let personUid = person.value as! String

                self.printPersonInfo(uid: personUid)
            }
        })

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Если вы хотите установить этот тип ограничения для Firebase (и многих других баз данных NoSQL), подумайте о том, чтобы смоделировать его в своих данных.

В вашей текущей модели вы используете push-идентификаторы для каждого нового голосования.

"peopleWhoLike" : {
  "-LmLjHwwGj1kt5qLM20X" : "NMNQYJ5z64fATK2MMs7m0ggHl0k2",
  "-LmLtlp5Sm900SV8xP4i" : "NMNQYJ5z64fATK2MMs7m0ggHl0k2"
}

Поскольку каждый раз, когда вы звоните push / childByAutoId(), гарантированно генерируется уникальное новое местоположение, пользователи могут генерировать откаты так часто, как они хотят.


Есливы хотите, чтобы каждый пользователь мог голосовать один раз, например, вы можете хранить данные следующим образом:

"peopleWhoLike" : {
  "NMNQYJ5z64fATK2MMs7m0ggHl0k2": true,
  "another-Uid-ThatIs-Different": true
}

Теперь, если один и тот же человек пытается проголосовать снова, он просто устанавливает те же данные вИ снова истина, поэтому ничего не меняется.

* * * * * true в приведенном выше значении не имеет смысла (вы просто не можете хранить ключ без значения), но вы также можете использовать его, чтобы отслеживать, как часто пользовательнажал кнопку «Мне нравится»:

"peopleWhoLike" : {
  "NMNQYJ5z64fATK2MMs7m0ggHl0k2": 3,
  "another-Uid-ThatIs-Different": 2
}

Таким образом, вы можете определить, сколько людей понравилось посту (подсчитав количество узлов), а также сколько раз им понравилось (суммируя значения).


Если вы хотите, чтобы пользователю что-то нравилось один раз за интервал времени, вы можете смоделировать это и в своей модели данных:

"peopleWhoLike" : {
  "20191010": {
    "NMNQYJ5z64fATK2MMs7m0ggHl0k2": true
  },
  "20191010": {
    "NMNQYJ5z64fATK2MMs7m0ggHl0k2": true,
    "another-Uid-ThatIs-Different": true
  }
}

Чтобы написать структуру этоготипа, вы можете использовать что-то вроде:

ref.child("people")
   .child(self.postID)
   .child("peopleWhoLike")
   .child("20191012")
   .child(Auth.auth().currentUser!.uid)
   .setValue(true)
0 голосов
/ 15 октября 2019

Для этого отследите, когда пользователю понравилась запись. Если пользователю не понравилось сообщение сегодня, то он может продолжить. Если нет, отобразите сообщение о том, что им может не понравиться сообщение.

В псевдокоде:

if (user has liked post && the like is today) {
display message
} else {
allow the like to go through
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...