Ładowanie obrazu z CoreData w cellForRowAtIndexPath spowalnia przewijanie
Pracuję nad UITableView, który jest bardzo podobny do natywnej aplikacji Photo systemu iOS: ma wiele wierszy z 4 miniaturami obrazów w każdym wierszu. (tj. każdy UITableViewCell ma 4 UIImageViews) Wszystkie miniatury załadowane z Core Data.
Wielokrotnie poprawiałem moją implementację i widzę poprawę wydajności, ale nadal nie można przewijać tak płynnie jak aplikacja Photo.
Muszę doradzić, jak prawidłowo buforować zdjęcia, aby uzyskać najlepszą wydajność. To właśnie próbowałem:
1. Moja pierwsza próba (niezwykle opóźniona przy przewijaniu)
Obrazy są przechowywane z typem Transformable w CoreData.W funkcji cellForRow każdy obraz jest pobierany z CoreData w locie.2. Druga próba (szybsza, ale trochę opóźniona podczas przewijania)
Obrazy są przechowywane z typem Binary Data z opcją „pamięć zewnętrzna” zaznaczoną w CoreData.W funkcji cellForRow każdy obraz jest najpierw ładowany z Core Data, a następnie zapisywany w pamięci NSCache, więc następnym razem, gdy cellForRow odpali, użyjemy UIImage z NSCache bezpośrednio, jeśli jest dostępny.Po użyciu NSCache do buforowania obrazów załadowanych z CoreData, przewijanie jest wyraźnie szybsze, ale ponieważ obrazy nadal muszą być ładowane z CoreData, gdy nie jest jeszcze dostępne w NSCache, przewijanie będzie nadal nierówne od czasu do czasu.
Więc, musi być lepszy sposób, mógłbym załadować wszystkie obrazy do pamięci, ale ponieważ może być duża liczba lub rzędy obrazów, więc nie planowałem w ogóle wczytać obrazów.
Co jeszcze mogę zrobić, aby szybciej załadować obraz w cellForRowAtIndexPath?