Sto utilizzando Grand Central Dispatch per caricare le immagini di un UITableViewCell
in modo asincrono. Funziona bene, tranne che in alcuni casi di confine in cui la cella viene riutilizzata e un blocco precedente carica l'immagine sbagliata.Riutilizzo UITableViewCell con GCD
mio codice attuale è simile al seguente:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSString *imagePath = [self imagePathForIndexPath:indexPath];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
dispatch_sync(dispatch_get_main_queue(), ^{
cell.imageView.image = image;
[cell setNeedsLayout];
});
});
return cell;
}
Per quanto ne so code GCD non possono essere fermati. Come si può prevenire allora questo caso di confine? O dovrei usare qualcos'altro invece di GCD per risolvere questo problema?
Sto usando GMGridView per mostrare una grande quantità di miniature di immagini e con lo stesso identico problema. Sto anche usando GCD per caricare le miniature dal mio webserver al volo. – Humayun