Как синхронизировать данные прослушивателя моментальных снимков c в Swift 5? - PullRequest
0 голосов
/ 07 февраля 2020

: D Я боролся с синхронизацией текстового поля моей метки при заполнении UITableView при получении данных из Firestore.


import UIKit
import Firebase
import SDWebImage

class FeedViewController: UIViewController, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!

    var postsArray = [Post]()

override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UINib(nibName: "postHeaderCell", bundle: nil), forCellReuseIdentifier: "headerCell")

loadPosts()
}

 func loadPosts () {

        db.collection("Posts").order(by: "numberOfLikes", descending: true).addSnapshotListener { (snapshot, error) in

            self.postsArray = []
            self.documentIDArray = []

            if error != nil {
                print("Error getting data")
            }
            else {
                if snapshot?.isEmpty == false && snapshot != nil {

                    self.postsArray.removeAll(keepingCapacity: false)

                    for document in snapshot!.documents {

                        if let createdBy = document.get("createdBy") as? String, let location = document.get("location") as? String, let timeLeft = document.get("timeLeft") as? String, let image = document.get("imageUrl") as? String, let caption = document.get("caption") as? String, let numberOfLikes = document.get("numberOfLikes") as? Int, let numberOfComments = document.get("numberOfComments") as? Int, let numberOfShares = document.get("numberOfShares") as? Int, let uploadTime = document.get("uploadTime") as? Timestamp, let username = document.get("username") as? String, let documentId = document.get("documentId") as? String {

                            let newPost = Post(createdBy: createdBy, location: location, timeLeft: timeLeft, image: image, caption: caption, numberOfLikes: numberOfLikes, numberOfComments: numberOfComments, numberOfShares: numberOfShares, uploadTime: uploadTime.dateValue(), username: username, documentId: documentId)



                            self.postsArray.append(newPost)

                            DispatchQueue.main.async {
                                self.tableView.reloadData()
                            }

                        }

                    }

                }



            }

        }

    }

}

В моем расширении источника данных у меня есть следующее:

extension FeedViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return postsArray.count

    }

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


        cell.name.titleLabel!.text = postsArray[indexPath.row].username
        cell.location.text = postsArray[indexPath.row].location
        cell.timeLeft.text = postsArray[indexPath.row].timeLeft
        cell.likesNumber.text = String(postsArray[indexPath.row].numberOfLikes)
        cell.commentsNumber.text = String(postsArray[indexPath.row].numberOfComments)
        cell.sharesNumber.text = String(postsArray[indexPath.row].numberOfShares)
        cell.caption.text = postsArray[indexPath.row].caption
        cell.postID.text = postsArray[indexPath.row].documentId

        cell.delegate = self

        cell.postImage.sd_setImage(with: URL(string: self.postsArray[indexPath.row].image), completed: nil)

        return cell
    }

}

Я решил, что самый быстрый способ получить доступ к postID DocumentID внутри класса UITableViewCell - использовать скрытый текст ярлык, который показывает идентификатор документа.

Я хотел бы нажать кнопку «Нравится» на сообщении в классе UITableViewCell. Но каждый раз, когда нажимается кнопка «Мне нравится», имя пользователя сообщения не загружается правильно, и в нем отображается текст по умолчанию из дизайна, что заставляет меня поверить, что оно не синхронизируется во времени с базой данных Firestore. Следующая функция кнопок находится в моем классе UITableViewCell:

    @IBAction func likeButtonPressed(_ sender: Any) {

        let db = Firestore.firestore()

        if let likesAmount = Int(likesNumber.text!) {

            let likeKey = ["numberOfLikes" : likesAmount + 1] as [String : Any]

            db.collection("Posts").document(postID.text!).setData(likeKey, merge: true)


        }

Моя цель состоит в том, чтобы просто увеличивать счетчик похожих на 1 каждый раз, когда нажимается аналогичная кнопка. Для целей проекта, это нормально, если пользователь может понравиться сообщение более одного раза. Будем весьма благодарны за любые идеи о том, как исправить проблему с синхронизацией.

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