Ich versuche, Bilder aus meiner Firebase-Datenbank herunterzuladen und sie in collectionviewcells zu laden. Die Bilder werden heruntergeladen, aber ich habe Probleme, sie alle asynchron herunterzuladen und zu laden.Bilder von der URL asynchron herunterladen und zwischenspeichern
Momentan, wenn ich meinen Code letzten Bild heruntergeladen lade. Wenn ich jedoch meine Datenbank aktualisiere, wird die Sammlungsansicht aktualisiert, und das neue Profil des letzten Benutzerprofils wird ebenfalls geladen, aber der Rest fehlt.
Ich würde lieber nicht eine 3rd-Party-Bibliothek verwenden, so dass alle Ressourcen oder Vorschläge sehr geschätzt werden.
Hier ist der Code, der das Herunterladen Griff:
func loadImageUsingCacheWithUrlString(_ urlString: String) {
self.image = nil
// checks cache
if let cachedImage = imageCache.object(forKey: urlString as NSString) as? UIImage {
self.image = cachedImage
return
}
//download
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
//error handling
if let error = error {
print(error)
return
}
DispatchQueue.main.async(execute: {
if let downloadedImage = UIImage(data: data!) {
imageCache.setObject(downloadedImage, forKey: urlString as NSString)
self.image = downloadedImage
}
})
}).resume()
}
ich die Lösung glaube, irgendwo liegt die Kollektion in Neuladen ich wo genau weiß einfach nicht, es zu tun.
Irgendwelche Vorschläge?
EDIT: Hier wird die Funktion aufgerufen; mein cellForItem at indexpath
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: userResultCellId, for: indexPath) as! FriendCell
let user = users[indexPath.row]
cell.nameLabel.text = user.name
if let profileImageUrl = user.profileImageUrl {
cell.profileImage.loadImageUsingCacheWithUrlString(profileImageUrl)
}
return cell
}
Die einzige andere Sache, die ich vielleicht glauben, dass die Bilder Laden beeinflussen könnte, ist diese Funktion, die ich verwenden, um die Benutzerdaten herunterzuladen, die in viewDidLoad
genannt wird, aber alle anderen Daten-Downloads korrekt.
func fetchUser(){
Database.database().reference().child("users").observe(.childAdded, with: {(snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let user = User()
user.setValuesForKeys(dictionary)
self.users.append(user)
print(self.users.count)
DispatchQueue.main.async(execute: {
self.collectionView?.reloadData()
})
}
}, withCancel: nil)
}
Aktuelles Verhalten:
Wie für das aktuelle Verhalten der letzte Zelle ist die einzige Zelle, die das heruntergeladene Profil-Bild zeigt; Wenn es 5 Zellen gibt, ist die 5. die einzige, die ein Profilbild anzeigt. Auch wenn ich die Datenbank aktualisiere, dh einen neuen Benutzer darin registriere, wird die Sammlung aktualisiert und zeigt den neu registrierten Benutzer korrekt mit ihrem Profilbild zusätzlich zu der alten letzten Zelle an, die das Bild korrekt heruntergeladen hat. Der Rest bleibt jedoch ohne Profilbilder.
Können Sie Ihren CollectionViewController anzeigen? – javimuu
@javimuu Ich habe eingefügt, wo die Funktion aufgerufen wird. – Stefan
Verwenden Sie sdwebimage Bibliothek, um das Bild einfach zu laden. –