: 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 каждый раз, когда нажимается аналогичная кнопка. Для целей проекта, это нормально, если пользователь может понравиться сообщение более одного раза. Будем весьма благодарны за любые идеи о том, как исправить проблему с синхронизацией.