Hallo,
ich habe aktuell ein riesiges caching Problem und weiß nicht so recht weiter. Mein Hauptproblem besteht darin das ich die lokalen Bilder eines Users fetche und diese in eine CollectionViewCell lade.
Nun fetche ich aber alle Bilder die lokal so rum liegen und ihr könnt euch vorstellen dass das von User zu User teilweise gigantische Zahlen sein können.
Dadurch das ich manchmal so um die 1000 Bilder fetche braucht die CollectionView dann auch dementsprechend lange um sich zu zeigen und alles anzuzeigen.
Ich habe natürlich schon im Netz nach Antworten gesucht und bin dabei, was CollectionViews angeht, auf eine Funktion namens prefetchItemsAt gestoßen mit der ich immerhin schon mal die Cells prefetchen kann so das nicht alle Zellen von beginn an existieren.
Meine Frage wäre nun also wie ich es hinbekomme das nicht alle Bilder auf einmal geladen werden sondern halt Stück für Stück über eine Art prefetching ?
Aktuell fetche ich über diese Funktion alle Bilder:
Alles anzeigen
Desweiteren habe ich mich auch schon mal mit startCachingImages beschäftigt und eine Funktion dazu geschrieben die in der ViewDidAppear() aufgerufen wird:
Alles anzeigen
ich habe aktuell ein riesiges caching Problem und weiß nicht so recht weiter. Mein Hauptproblem besteht darin das ich die lokalen Bilder eines Users fetche und diese in eine CollectionViewCell lade.
Nun fetche ich aber alle Bilder die lokal so rum liegen und ihr könnt euch vorstellen dass das von User zu User teilweise gigantische Zahlen sein können.
Dadurch das ich manchmal so um die 1000 Bilder fetche braucht die CollectionView dann auch dementsprechend lange um sich zu zeigen und alles anzuzeigen.
Ich habe natürlich schon im Netz nach Antworten gesucht und bin dabei, was CollectionViews angeht, auf eine Funktion namens prefetchItemsAt gestoßen mit der ich immerhin schon mal die Cells prefetchen kann so das nicht alle Zellen von beginn an existieren.
Meine Frage wäre nun also wie ich es hinbekomme das nicht alle Bilder auf einmal geladen werden sondern halt Stück für Stück über eine Art prefetching ?
Aktuell fetche ich über diese Funktion alle Bilder:
Quellcode
- func grabPhotos() {
- let imgManager = PHCachingImageManager.default()
- let requestOptions = PHImageRequestOptions()
- requestOptions.isSynchronous = true
- requestOptions.deliveryMode = .highQualityFormat
- //Nach Datum ordnen
- let fetchOptions = PHFetchOptions()
- fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
- fetchResult = PHAsset.fetchAssets(with: fetchOptions)
- print(fetchResult)
- if fetchResult.count > 0 {
- for i in 0..<fetchResult.count {
- imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: {
- image, error in
- self.imageArray.append(image!)
- })
- }
- } else {
- print("You got no photos")
- self.collectionView.reloadData()
- }
- }
Desweiteren habe ich mich auch schon mal mit startCachingImages beschäftigt und eine Funktion dazu geschrieben die in der ViewDidAppear() aufgerufen wird:
Quellcode
- func startCachingImages() {
- let imgManager = PHCachingImageManager()
- let requestOptions = PHImageRequestOptions()
- requestOptions.isSynchronous = true
- requestOptions.deliveryMode = .highQualityFormat
- //Nach Datum ordnen
- let fetchOptions = PHFetchOptions()
- fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
- fetchResult = PHAsset.fetchAssets(with: fetchOptions)
- let indexSet = IndexSet(0..<fetchResult.count)
- imgManager.startCachingImages(for: fetchResult.objects(at: indexSet), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions)
- }