Sono nuovo per GCD e blocchi e mi sto facilitando.GCD - thread principale e di sfondo per l'aggiornamento di UIImageView
Sfondo: Sto lavorando su una routine di caricamento lenta per un UIScrollView utilizzando ALAssetsLibrary. Quando il mio UIScrollView viene caricato, lo popolo con lo aspectRatioThumbnails
dei miei ALAssets e quindi mentre l'utente scorre, chiamo la routine di seguito per caricare il fullScreenImage
del set ALA attualmente visualizzato. Sembra funzionare.
(se qualcuno ha una procedura di caricamento più pigro per favore pubblica un commento Ho visto tutto quello che ho potuto trovare oltre al video WWDC ma sembra che si occupi di più di piastrellatura o abbia molta più complessità di quella che mi serve)
la mia domanda: io uso un thread in background per gestire il caricamento del fullScreenImage
e quando questo è fatto io uso il thread principale per applicarlo al UIImageView. Devo usare il thread principale? Ho visto che tutti gli aggiornamenti UIKit devono essere eseguiti sul thread principale, ma non sono sicuro che ciò si applichi a UIImageView. Stavo pensando che lo fa, dal momento che è un elemento dello schermo, ma poi ho capito che semplicemente non lo sapevo.
- (void)loadFullSizeImageByIndex:(int)index
{
int arrayIndex = index;
int tagNumber = index+1;
ALAsset *asset = [self.assetsArray objectAtIndex:arrayIndex];
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *tmpImage = [[UIImage alloc] initWithCGImage:asset.defaultRepresentation.fullScreenImage];
if ([weakSelf.scrollView viewWithTag:tagNumber] != nil){
dispatch_async(dispatch_get_main_queue(), ^{
if ([weakSelf.scrollView viewWithTag:tagNumber]!= nil){
UIImageView * tmpImageView = (UIImageView*)[weakSelf.scrollView viewWithTag:tagNumber];
tmpImageView.image = tmpImage;
}
});
}
});
}
E 'il rendering dell'immagine quando si mette in thread in background? – iDev
@ACB: appena fatto un test - sì, rende il rendering ma circa 5 volte più lento di chiamarlo dal thread principale (come nel mio codice di esempio). –
Ma come per la documentazione di UIView, dovresti usarlo nella discussione principale. Ho pubblicato quella parte dalla documentazione nella mia risposta. – iDev