if let toID = message.chatPartnerId() {
firebaseReference.child(toID).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: Any] {
cell.nameLabel.text = dictionary["displayname"] as? String
let pic = dictionary["pictureURL"] as! String
print("THIS IS THE URL FOR EACH DISPLAYNAME")
print(dictionary["displayname"] as? String)
print(pic)
if let imageFromCache = MainPageVC.imageCache.object(forKey: pic as NSString) {
cell.pictureLabel.image = imageFromCache
} else {
let requested = URLRequest(url: URL(string: pic)!)
URLSession.shared.dataTask(with: requested) {data, response, err in
if err != nil {
print(err)
} else {
DispatchQueue.main.async {
let imageToCache = UIImage(data: data!)
MainPageVC.imageCache.setObject(imageToCache!, forKey: pic as NSString)
//cell.pictureLabel.image = nil
cell.pictureLabel.image = imageToCache
}
}
}.resume()
}
}
})
}
return cell
}
Ich habe diesen Code in meinem cellForRowAtIndexPath
und ich bekomme eine Tonne wirklich schlechtes Verhalten. Ich bekomme auch ähnliches Verhalten auf anderen Seiten, aber aus irgendeinem Grund gibt dieser Codeblock mit ungefähr 90% Konsistenz falsche Informationen für Zellen zurück.Bilder laden falsch mit Cache
Ich bekomme viele doppelte Bilder verwendet, displaynames
an den falschen Stellen, aber wenn ich tatsächlich in eine Person klicke, zeigt meine Detailseite jedes Mal die richtigen Informationen. Dieser Code ist der typische didSelectRowAtIndexPath
und die Person übergeben.
Was ich nicht verstehe ist, warum auf der ersten Belastung dieser Seite alle Informationen vermasselt sind, aber wenn ich jemanden anklicke und zurückkomme, hat der ganze tableview
korrekte Namen und Bilder. Die Namen/Bilder reparieren auch, wenn ich eine Zelle vom Bildschirm scrollen und dann zurückkommen.
Ich bekomme dieses Verhalten überall in meiner App, mittlerweile sehe ich Caching/Laden überall so gemacht. Ist es, weil ich den Code in meinem cellForRowAtIndexPath
laufen lasse? Der einzige Unterschied, den ich sehe, ist, dass ich es dort ausführe, anstatt eine Funktion innerhalb meiner Person-Klasse zu erstellen, die Zellen konfiguriert und so ausführt. Was ich nicht verstehe, ist, warum das einen Unterschied machen würde, denn soweit ich weiß, wäre das Ausführen einer Funktion innerhalb von cellforRowAtIndexpath
dasselbe wie das Kopieren desselben Codes in dieselbe?
Irgendwelche Ideen/Vorschläge?
Edit: Ich bin immer eine sehr ähnliche Situation, wenn ich den folgenden Code renne:
self.PersonalSearchesList = self.PersonalSearchesList.sorted{ $0.users > $1.users }
self.tableView.reloadData()
Wo ich meine Array bin Sortierung vor meinen Daten neu zu laden. Die Informationen werden manchmal zuerst falsch geladen, aber sobald ich die Zelle vom Bildschirm scrolle, komme ich zurück zu ihr, sie korrigiert sich immer selbst.
Löschen Sie das Zellbild in Vorbereitung für die Wiederverwendung, versuchen Sie auch, das Bild in willDisplayCell zu setzen. –
Ich hatte PrepareForReuse vorher noch nicht gesehen, also habe ich einen Test "Dies wird aufgerufen" gemacht und das Bild auf Null gesetzt. Ich habe das Bild noch nicht in WillDisplayCell eingestellt, aber mein Array ist 6 Leute lang, aber ich bekomme das "Dies wird aufgerufen" ungefähr 20 Mal in der Konsole ausgedruckt. Wenn mein Array 6 Personen lang ist, sollte das nur 6 mal ja heißen? Vielleicht ist das ein Hinweis darauf, was vor sich geht. Ich ziehe aber vom firebase, also macht das vielleicht Sinn, wie es für das Einzelteil 1 genannt werden würde. Dann für Einzelteil 1 und 2 und dann für 1 2 und 3 und so weiter. – user6820041
Ja, ich bekomme immer noch das gleiche Problem mit diesen Vorschlägen leider. – user6820041