2010-08-18 5 views
5

Qual è un modo decente per caricare UIImages su richiesta senza bloccare il thread principale?Lazy Loading UIImages da file senza bloccare il thread principale?

Contesto: ho un paio di migliaia di immagini su un muro che posso scorrere. Ovviamente non è possibile caricare solo tutti gli UIImages, quindi ora sono solo pigro a caricare quelli che vengono visualizzati, e poi rilasciarli quando non sono più necessari. Il problema è che il caricamento di UIImages dai file richiede un po 'di tempo notevole, giusto il tempo necessario per causare la balbuzie durante lo scorrimento. Queste non sono affatto immagini grandi (circa 250x250, forse 20-30kb ciascuna), ma causano ancora balbuzie.

risposta

0

Io uso una sottoclasse UIImageView personalizzata per qualcosa di simile a questo. Viene principalmente utilizzato per scaricare immagini (si pensi ad avatar e immagini in uno stream di Twitter, ad esempio), quindi utilizza NSURLConnection per scaricare l'immagine da un URL. URLConnection richiama quindi un metodo delegato al termine, che poi utilizzo per aggiornare UIImageView. Un extra aggiunto in seguito è un dizionario statico con immagini memorizzate nella cache, quindi le immagini utilizzate più spesso non devono essere scaricate ogni volta. Questo è abbastanza utile per cose come gli avatar di twitter menzionati in precedenza.

Non sono sicuro se si sta cercando di caricare le immagini dal web o localmente, quindi questo potrebbe non applicarsi perfettamente alla vostra situazione, ma spero che questo aiuta ...

0

Si può fare questo molto semplicemente modo. Prima crea una coda quando crei un oggetto UIScrollView. Dopo aver creato è possibile caricare l'immagine dalla memoria locale con la coda appena creata.

//get a dispatch queue 
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 


//this will start the image loading in bg 
dispatch_async(concurrentQueue, ^{   
    NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL]; 

    //this will set the image when loading is finished 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     imageView.image = [UIImage imageWithData:image]; 
    }); 
});