Ce strategie ati adopta ca sa afisati exact ce afiseaza si Photos app, o lista de thumburi cate 4 pe linie?
Eu am ales sa fac un UITableView si pe fiecare linie am 4 coloane, in fiecare coloana incarc thumbul unei poze intr-un nou thread dar asta nu pare sa aibe niciun efect, fie ca incarc intr-un nou thread fie ca nu, tabelul cam sacadeaza la scroll. Am o chestie echivalenta pentru incarcat poze de pe net si functioneaza f smooth, diferenta e ca construiesc UIImage din NSData.
Photos app se misca asa de bine incat am impresia ca thumburile sunt deja preincarcate intr-un scrollview.
- (void) loadImageFromLibrary:(NSURL *)url {
// Load image in a new thread [NSThread detachNewThreadSelector:@selector(loadImageCG:) toTarget:self withObject:url]; } - (void) loadImageCG:(NSURL*)url { ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){
Interesanta clasa, dar e pt ios6 iar Photos se misca bine dintotdeauna. L-ai incercat pt ce-mi trebuie mie? Eu cred ca fiind poze locale totul este practic instant si se creeaza pozele toate succesiv fara pauza si asta blocheaza tabelul.
pai poti folosi UICollectionView si cell-urile le tratezi ca pe UITableView, le incarci asincron! doar ca-ti usureaza mult mai tare munca cu layout-ul, mai ales pe landscape!
sunt multe librarii de la Apple care au fost private si au ajuns publice pana la urma, deci sa nu te mire ca Photos se misca bine dintotdeauna!
UICollectionView e ok ca varianta, dar esti limitat la ios6. Cand am de afisat imagini pe grupuri cu care sa poti interactiona cand selectezi o poza folosesc butoane in care adaug ca subview imaginea de tip CSAsyncImageView. Folosesc asincron tocmai pentru a nu bloca scroll-ul si totul merge fluent
for (int i = 0; i < [[self.selectedEvent objectForKey:@“pressList”] count]; i++)
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(i*60+5, 0, 57, 57)];
ios6 n-ar trebui sa fie o problema pt ca pana si 3gs il suporta, pentru ceva mai slab nici nu vreau sa fac. O sa pun in aplicare collectionview sa vad ce iese.
Varianta oferita de mine e cea mai ok pentru incarcat pozele de pe mediu online, deoarece le poti aranja cum doresti, fara limitari(codul dat e doar pentru scroll orizontal, pentru vertical inca un for si un buton :D). Bafta
Vaianta ta nu este chiar asa de ok pentru ca daca ai sute-mii de elemente ai dat de dracu si cu memoria si cu performantele.
Apoi nici nu trebuie sa creezi un UIButton si sa adaugi din exterior imaginea cand imaginea poate sa extinda UIControl direct.
Am avut la prima mea aplicatie thumburi puse intr-un scrollview aranjate pe linii si coloane, n-au fost probleme pentru ca nu aveam multe poze, dar nu asa se face.
cred ca trebuie cacheuite in avans imaginile, am reusit sa obtin ceva multumitor daca fac thumburile mai mari si view-ul mai mic, deci mai putine poze. nu-mi dau seama daca chiar sacadeaza sau faptul ca apar cu un mic delay imi dau impresia asta.
Pentru < 6.0 iti recomand https://github.com/steipete/PSTCollectionView
.ral:cr: nu vad de ce ar sacada daca faci totul async.
UIImage e thread-safe, esti sigur ca faci totul in backgroun si doar update-ul de UI in main thread?
si imageWithData: ar trebui apelat tot in background si doar cand setezi UIImage-ul sa o faci pe main thread.
Am folosit si eu la ultimul proiect CollectionView si merge perfect, daca sacadeaza sigur ai ceva ce blocheaza UI-ul.
.ral:cr: tocmai am facut mai devreme un update pe gutHub la libraria asta, am testat-o si pare sa mearga ok, daca ai timp o poti incerca sa imi spui daca mai ai aceasi problema cu imaginile. https://github.com/lucianboboc/LBCache-DemoProject
Cred ca am sa ma intorc la problema zilele urmatoare, pana atunci uite codul pe care-l folosesc. Am incercat sa creez UIImage in alt thread dar tot la fel face.
In comparatie cu cealalta metoda cu tableview acum sacadeaza si la imaginile de pe net.
UICollectionView e Ui element, nu e thread safe, posibil aici sa fie problema:
[NSThread detachNewThreadSelector:@selector(loadImageCG:)
toTarget:self
withObject:url];
Eu inteleg ca asta apeleaza pe alt thread: [cell loadImageCGWithObject: url] sau ceva de genul.
Eu as face alta clasa “model” image fetcher si as face delegare pt a returna imaginea catre cell cand e gata. sau as muta in controller metodele pt load.
detachNewThreadSelector:toTarget:withObject:
Detaches a new thread and uses the specified selector as the thread entry point.
aTarget
The object that will receive the message aSelector on the new thread.
Accesand cell-ul pe alt thread e problema.
Mai bine regandesti modelul, cum am zis eu am crea o clasa ImageFether, i-as pune un UIImage ca proprietate eventual si url-ul cu sursa, si as crea atatea insante ale clasei, cate cell-uri ai avea nevoie si le-as adauga toate intr-in array.
in cellForItemAtIndexPath as crea verifica proprietatea image a fiecarei instane ImageFetcher pt fiecare cell.
Daca image nu exista as apela:
dispatch_async(dispatch_get_global_queue(0,0),^{ // aici functiile pt load imagine din sursa ta // cand ai UIImage-ul setat ca proprietate la imageFetcher-ul din artay-ul tau de la index-ul corespunzator