Utilizați memoria cache de sistem a obiectelor UIImage cu imagini încărcate din memoria cache a discului (NSCachesDirectory)?

Încerc să îmbunătățesc performanța derulării pe un UITableView care utilizează celule cu imagini preluate de pe web, dar stocate în NSCachesDirectory. Celulele au o vizualizare de conținut personalizată pentru a desena conținutul (o imagine).

Când folosesc o imagine substituent din pachetul de aplicații, folosind [UIImage imageNamed:@"Placeholder.png"], performanța derulării este super rapidă.

Când încarc o imagine din memoria cache a discului (NSCachesDirectory) folosind [UIImage imageWithContentsOfFile:cachePath], performanța derulării se înrăutățește.

Conform documentației, imageNamed: memorează imaginea în cache și imageWithContentsOfFile: nu.

Cum să utilizați memoria cache de sistem a lui UIImage când utilizați imageWithContentsOfFile:?

Mulțumesc mult!


person Martijn Thé    schedule 21.02.2010    source sursă
comment
Poate doriți să vedeți o întrebare recentă de-a mea unde am rezolvat problema prin stocarea unei imagini necomprimate.   -  person Victor Engel    schedule 28.09.2013


Răspunsuri (3)


Se pare că este posibil să se folosească calea către o imagine în NSCachesDirectory ca argument pentru metoda [UIImage imageNamed:]. Metoda acceptă căi relative (față de pachetul de aplicații), de exemplu: @"../Library/Caches/SomeCachedImage.png" funcționează.

UIImage memorează automat imaginea în memorie dacă este utilizată de mai multe ori, ceea ce îmbunătățește performanța atunci când o imagine este utilizată de mai multe ori într-o vizualizare de tabel.

person Martijn Thé    schedule 24.02.2010
comment
Pentru mine, această metodă [UIImage imageNamed:] nu poate încărca imaginea pe care o dau la o anumită cale, returnează întotdeauna zero - person vodkhang; 20.08.2010
comment
merge pentru mine. Voi încerca cu NSPicturesDirectory, merită! - person Nielsou Hacken-Bergen; 31.08.2011

Problema este cel mai probabil că încărcați și decomprimați imaginea în bucla principală de rulare. Acest lucru va bloca interfața cu utilizatorul pentru o perioadă scurtă de timp. Obțineți performanțe mult mai bune dacă faceți încărcarea și decomprimarea într-un fir separat și numai setați imaginea în bucla principală. (Ceea ce este necesar și pentru modificările interfeței cu utilizatorul, care este setarea unei imagini pe un UIImageView)

Acest lucru va necesita mai multă infrastructură. De exemplu, o schemă de notificare sau observarea valorii cheie.

person Stefan Arentz    schedule 21.02.2010
comment
Da, tocmai asta este problema. Speram la o soluție disponibilă. Dar bănuiesc că nu este acolo. Multumesc pentru raspuns. - person Martijn Thé; 22.02.2010
comment
Dacă vă place răspunsul, ar trebui să îl votați pozitiv sau să îl marcați ca rezolvat. - person Stefan Arentz; 22.02.2010
comment
UIImage decomprimă leneș datele bitmap a imaginii, așa că în multe (cele mai multe?) situații acest lucru nu va ajuta cu adevărat - încărcarea de pe disc se va întâmpla pe firul dvs. de fundal, dar decomprimarea (care durează adesea mai mult decât încărcarea datelor) se va întâmpla atunci când setați imaginea, care trebuie să se întâmple pe firul principal. - person Nick Forge; 29.09.2011

Nu poţi. imageWithContentsOfFile: va încărca întotdeauna imaginea din fișier (deși leneș). Ceea ce puteți face este să creați un cache în memorie al dvs. cu NSArrays sau NSDictionaries, în funcție de modul în care doriți să faceți căutarea.

person Mihai Damian    schedule 21.02.2010