UITableViewCell с задержками изображения
Ребята, у меня есть UITableView с некоторыми изображениями, которые загружаются из Интернета. Фотографий очень мало, но мой стол не работает идеально. Мой код:
static NSString *CellIdentifier = @"Cell";
TDBadgedCell *cell = [[[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.badgeColor = [UIColor colorWithRed:((float)128 / 255.0f) green:((float)161 / 255.0f) blue:((float)176 / 255.0f) alpha:1];
NSDictionary *dict = nil;
if (searching == NO) {
dict = [companies objectAtIndex:indexPath.row];
} else {
dict = [copyListOfItems objectAtIndex:indexPath.row];
}
cell.badgeString = [NSString stringWithFormat:@"%@",[dict objectForKey:@"rating"]];
cell.textLabel.numberOfLines = 2;
cell.textLabel.text = [dict objectForKey:@"title"];
cell.textLabel.textColor = [UIColor colorWithRed:((float)80 / 255.0f) green:((float)80 / 255.0f) blue:((float)80 / 255.0f) alpha:1];
cell.textLabel.font = [UIFont fontWithName:@"Verdana" size:17.0];
UIImage *img = [[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dict objectForKey:@"image"]]]] scaleToFitSize:CGSizeMake(16, 16)];
cell.imageView.image = img;
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
return cell;
TDBadgedCell не может быть причиной, потому что без изображений он работает идеально. Я использую открытые классы для изменения размера UIImage. Вы можете найти это здесь.
У тебя есть идеи?
2 ответа
Я разместил код, который показывает вам, как справиться с этим. У нас есть класс MyImageDownloader, который загружает изображение по запросу и публикует уведомление, когда оно приходит:
Источник данных табличного представления предоставляет заполнитель, если MyImageDownloader не имеет изображения, и предоставляет изображение, если оно есть:
Таким образом, все, что нам нужно сделать, это перезагрузить таблицу, когда изображение прибывает. м.
Вы можете выполнить загрузку изображения в другом потоке, чтобы он не блокировал основное. Вы можете сделать это так:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
// download the images here
dispatch_async(dispatch_get_main_queue(), ^{
// add them to your cell here
});
});
Поэтому вам нужно переключиться на другой поток для загрузки, а затем вернуться к основному потоку и добавить их в пользовательский интерфейс. Элементы пользовательского интерфейса должны обрабатываться только в основном потоке.