Я пытаюсь заполнить ячейку UITableView данными из моей базы данных пожарного магазина.
По некоторым причинам, когда я переключаюсь на вкладку приложения, содержащую мое табличное представление, я могу видеть хорошее изображение в течение полсекунды, а затем оно мигает на одно из предыдущей ячейки.
Затем, если я прокручиваю вниз и возвращаюсь вверх, хорошее изображение возвращается, но если я прокручиваю вверх и вниз, чтобы быстро, неправильные изображения вызываются снова.
Чтобы извлечь мои данные и заполнить ячейки, я делаю так:
В моем файле класса
Извлечение "основных предметов" (Это прекрасно работает)
- Идентификатор основного предмета
- Идентификатор подпункта 1
- Идентификатор подпункта 2
Получение сведений о «подпунктах»
- Идентификатор подпункта
- IMG URL подэлемента
- ...
Этот код также включает «бесполезный» код, используемый для целей тестирования, в надежде найти решение.
var groupNom:String = ""
var groupStyles:String = ""
var groupHeaderImg = [StorageReference]()
var groupIconeImg = [StorageReference]()
var videosArrayed = [String]()
var groupIconeURL:String = ""
func getGroupDetails(Did: String, completion: @escaping (_ message: String) -> Void) {
let db = Firestore.firestore()
let storage = Storage.storage()
let docRef = db.collection("groups").document(Did)
docRef.getDocument { (document, error) in
if let document = document, document.exists {
self.groupNom = document.get("nom") as! String
self.groupStyles = document.get("styles") as! String
let icone_img = document.get("icone_img") as! String
self.groupIconeImg.removeAll()
self.groupIconeImg.append(storage.reference(forURL: self.StorageRefRoot + "/groups/" + document.documentID + "/icones/" + icone_img + ".png"))
//self.groupIconeURL.removeAll()
self.groupIconeURL = self.StorageRefRoot + "/groups/" + document.documentID + "/icones/" + icone_img + ".png"
//print("id: \(Did) array d'icone: \(self.groupIconeImg)")
self.groupHeaderImg.append(storage.reference(forURL:"\(self.StorageRefRoot)/groups/\(Did)/headers/\(document.get("header_img") as! String).png"))
let stylesNSArray = document.get("styles_ids") as! Array<Any>
let stylesArrayed: [String] = stylesNSArray.compactMap({ $0 as? String })
var tempGroupStyles = ""
for i in stylesArrayed.indices {
let styleDocRef = db.collection("styles_groupes").document(stylesArrayed[i])
styleDocRef.getDocument { (document, error) in
if let document = document, document.exists {
//tempBarStyles = ""
if i < stylesArrayed.count-1 { // Si c'est le dernier element, on n'ajoute pas de virgule
tempGroupStyles = "\(tempGroupStyles)\(document.get("nom") as! String), "
} else {
tempGroupStyles = "\(tempGroupStyles)\(document.get("nom") as! String)"
//print("barstyles = \(tempGroupStyles)")
}
if i == stylesArrayed.count-1 {
self.groupStyles = tempGroupStyles
}
} else {
print("style to be decrypted do not exist")
return
}
completion("done")
}
}
let videosNSArray = document.get("videos_yt_ids") as! Array<Any>
self.videosArrayed = videosNSArray.compactMap({ $0 as? String })
} else {
print("Groups details does not exist")
return
}
completion("done")
}
}
В моем ViewController
- Верните столько ячеек, сколько есть Главных элементов, запустив Основные элементы 'класс (этот работает просто отлично)
- Для каждого основного элемента, извлеките информацию об идентификаторе субэлемента, запустив класс субэлемента
Этот код также включает «бесполезный» код, используемый для тестирования, в надежде найти решение.
var feedAbos = abo()
var feedBars = bar()
var feedGroupes = group()
@IBOutlet weak var abosCollectionView: UICollectionView!
@IBOutlet weak var aboFeedTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) // No need for semicolon
if Auth.auth().currentUser != nil {
//print("l'utilisateur en cours est: \(String(describing: Auth.auth().currentUser?.uid))")
feedAbos = abo()
feedAbos.getAbosFeed(uid: Auth.auth().currentUser!.uid, completion: { message in
self.aboFeedTableView.reloadData()
})
} else {
showLoginVC(viewToPresent: self, isModale: true)
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return feedAbos.feedLivesID.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView
.dequeueReusableCell(withIdentifier: "abosLivesFeedCell", for: indexPath as IndexPath) as! abosLivesFeedCell
self.feedGroupes.getGroupDetails(Did: self.feedAbos.feedGroupesID[indexPath.row], completion: { message in
if self.feedGroupes.groupIconeURL != "" {
cell.liveFeedGroupeImage.sd_setImage(with: URL(string: self.feedGroupes.groupIconeURL), placeholderImage: UIImage(named: "PLACEHOLDER1"))
} else {
cell.liveFeedGroupeImage.image = UIImage(named: "PLACEHOLDER1")
}
cell.liveFeedGroupeImage.layer.cornerRadius = 5
cell.liveFeedGroupeNomLabel?.text = self.feedAbos.feedGroupesID[indexPath.row]
})
cell.liveFeedDateLabel?.text = self.feedAbos.feedLivesDates[indexPath.row]
return cell
}
class abosLivesFeedCell: UITableViewCell {
@IBOutlet weak var liveFeedBarImage: UIImageView!
@IBOutlet weak var liveFeedGroupeImage: UIImageView!
@IBOutlet weak var liveFeedGroupeNomLabel: UILabel!
@IBOutlet weak var liveFeedDateLabel: UILabel!
@IBOutlet weak var liveFeedBarNomLabel: UILabel!
override func prepareForReuse() {
super.prepareForReuse()
self.liveFeedGroupeImage.image = nil
}
}
Я думаю, что это связано с тем фактом, что я использую асинхронные данныезагрузка. Я думаю, что, возможно, это связано с тем, как я справляюсь с завершением своих занятий в пожарном депо ... Я также читал о методах диспетчеризации, но я еще никогда не использовал это.
Я довольно потерян, правильно знаю, как этоможет быть, это что-то, чего я не знаю, потому что я определенно не профессиональный кодер:)
Надеюсь, кто-то может указать мне правильное направление или показать мне, где я совершил эту глупую и очень заметную ошибку; D
Спасибо всем!