Firebase слушает изменения количества лайков и отображает их на экране - PullRequest
0 голосов
/ 27 июня 2018

Когда пользователь удваивает изображение, количество лайков (сердечко) будет увеличиваться для каждого поста. Я попробовал этот код, но он не работает должным образом (например, когда я дважды нажимаю, он загружает один пост и дублирует его с разным количеством лайков (например, пост 1-1, пост 1-2 Like, пост 1-3 лайк). Как отобразить обновленное количество лайков, не дублируя пост?

func loadPosts() {
let ref = Database.database().reference()
ref.child("posts").observe(.childAdded) { (snapshot: DataSnapshot) in
    if  let dict = snapshot.value as? [String: Any] {
        guard let titleText = dict["title"] as? String else{return}
        let locationDetails = dict["location"] as! String
        let captionText = dict["caption"] as! String
        let photoUrlString = dict["photoUrl"] as! String
        let priceText = dict["price"] as! String
        let categoryText = dict["category"] as! String
        let usernameLabel = dict["username"] as! String
        let profileImageURL = dict["pic"] as! String
        let heartInt = dict["heart"] as! Int
        let timestampString = dict["timestamp"] as! String
        let post = Post(titleText: titleText, captionText: captionText, locationDetails: locationDetails, photoUrlString: photoUrlString, priceText: priceText,categoryText: categoryText, usernameLabel: usernameLabel, profileImageURL: profileImageURL, heartInt: heartInt, timestampString: timestampString)
        //append(post) to array
        self.posts.append(post)
        print(self.posts)
        self.collectionView.reloadData()

    }
}
}

func delayCompletionHandler(completion:@escaping (() -> ())) {
    let delayInSeconds = 0.5
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
        completion()
    }
}
//CollectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
 cell.reloadEvents = {
    self.delayCompletionHandler {
    self.loadPosts()
    }
}
}

Чтобы обнаружить HeartTapped, который находится в другом файле:

@objc func heartTapped(){
        print(" I heart u")
        let ref = Database.database().reference()
        heartInt1 += 1
        ref.child("posts").child(timestamp).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dic = snapshot.value as? [String : AnyObject]{
                var heartString = dic["heart"] as! Int
                heartString += 1
                ref.child("posts").child(self.timestamp).updateChildValues(["heart" : heartString])
            }
    })
    reloadEvents?()
}
}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Ваше решение - плохая практика. Когда вы имеете дело с базами данных, вы должны думать в масштабе, если Ким Кардашьян, который получает сердце каждую секунду, использует ваше приложение, что произойдет, загрузите и удалите все для каждого сердца? Это звучит эффективно?

Вам нужно найти способ загрузить только количество сердец, а не все, чтобы получить количество сердец.

Решением было бы добавить дополнительного ребенка ref.child("hearts") и затем получить loadHearts(), где вы получите только количество сердец.

0 голосов
/ 27 июня 2018

Глупо, мне следовало добавить self.posts.removeAll () в loadPosts (). Решаемые.

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