Firebase Firestore: Как внедрить систему «лайков»? - PullRequest
0 голосов
/ 27 февраля 2020

Когда текущий пользователь нажимает кнопку «Мне нравится», я запускаю транзакцию, но хочу проверить, понравился ли пользователю этот пост или нет. Если пользователю уже понравилась запись, я хочу уменьшить likeCounter и изменить внешний вид likeButton, в противном случае я хочу увеличить его.

Моя база данных Firestore с использованием collection.document.collection.document .... stuff :

"posts":
    - "post1":
        - uid: user1
        - likeCount: 2
        - caption: "caption1"
        - "likes":
            - "user1":
                - value: true
            - "user2":
                - value: true
    - "post2":
        - uid: user1
        - likeCount: 1
        - caption: "caption2"
        - "likes":
            - "user1":
                - value: true
            - "user4":
                - value: true
    - "post3":
        - uid: user2
        - likeCount: 3
        - caption: "caption3"
        - "likes":
            - "user1":
                - value: true
            - "user3":
                - value: true
            - "user4":
                - value: true

Это моя функция incrementLikes (), которая вызывается всякий раз, когда пользователь нажимает на likeButton

func incrementLikes() {
    let ref = Api.Post.REF_POSTS.document(self.post!.id!)

    Firestore.firestore().runTransaction({ (transaction, errorPointer) -> Any? in
        let sfDocument: DocumentSnapshot
        do {
            try sfDocument = transaction.getDocument(ref)
        } catch let fetchError as NSError {
            errorPointer?.pointee = fetchError
            return nil
        }

        guard let oldLikes = sfDocument.data()?["likeCount"] as? Int else {
            let error = NSError(
                domain: "AppErrorDomain",
                code: -1,
                userInfo: [
                    NSLocalizedDescriptionKey: "Unable to retrieve likes from snapshot \(sfDocument)"
                ]
            )
            errorPointer?.pointee = error
            return nil
        }
        transaction.updateData(["likeCount": oldLikes - 1], forDocument: ref)
        if let currentUser = Auth.auth().currentUser {
            ref.collection(K.likesCollection).document(currentUser.uid).delete()
        }
        DispatchQueue.main.async {
            self.likeImageView.image = UIImage(systemName: K.heart)
            self.likeImageView.tintColor = UIColor.black
        }
        return nil
    }) { (object, error) in
        if let error = error {
            print("Transaction failed: \(error)")
        } else {
            print("Transaction successfully committed!")
        }
    }
}

Я хочу знать, структурирована ли моя база данных правильно, наиболее масштабируемая путь, а также где и как я должен разместить наблюдателя, чтобы увидеть, понравился ли пользователю этот пост или нет.

1 Ответ

0 голосов
/ 28 февраля 2020

Когда я создавал платформу для социальных сетей, используя Firebase, было проще получить likeCounter, используя количество детей в должности. Затем, проверяя, должен ли likeButton показывать, нравится ли он, просто посмотрите, есть ли у них userId у детей.

Причина, по которой я нашел это лучше, заключалась в том, что:

  1. Счетчик мог легко иметь ошибки, если Inte rnet не был защищен.

  2. Когда я хотел, чтобы пользователи увидели, кому еще понравился пост, мне пришлось создать вторая ветка в любом случае. Это фактически сохраняет повторяющийся код.

Вот как я его настроил:

"posts":
    - "post1":
        - uid: user1
        - caption: "caption1"
                 -"LikedBy": 
                     -LikedBy:"user1"
                     -LikedBy:"user3"

// we added "LikedBy": so that instead of using likeCounter, 
//you could get the count from it's children. 
//To see if it's already liked by the user,
// find the name in this branch. If user1 finds his name in the children, 
//it'll return true. That means he's liked it.


    - "post2":
        - uid: user1
        - caption: "caption2"
               -"LikedBy":
                     -LikedBy:"user1"
                     -LikedBy:"user3"
    - "post3":
        - uid: user2
        - caption: "caption3"
              -"LikedBy":
                     -LikedBy:"user1"
                     -LikedBy:"user2"
                     -LikedBy:"user3"



// as you can see this is no longer used

"likesPerUser":
        - "user1":

        - "user2":

        - "user3":
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...