Я пытаюсь включить значки в UITableView. Таблица в основном выбирает веб-сайты, и я хочу отобразить значок справа. Сначала я поместил значок заполнителя справа и позволил функции в фоновом режиме работать. Эта функция берет URL-адрес веб-сайта, анализирует его и пытается найти значок. Если это не может найти это, это сохраняет то же самое изображение заполнителя; в противном случае он заменяет его на значок сайта. Сначала я попытался использовать [tableView reloadData], который хорошо работал в симуляторе, но он делал действительно странные и ненадежные вещи (например, он создавал несколько ячеек, но затем оставлял гигантскую пустую ячейку). Во всяком случае, я наткнулся на reloadRowsAtIndexPaths, и похоже, что мне нужно использовать функцию. Тем не менее, результаты все еще довольно ненадежны. У меня есть функция извлечения, работающая в фоновом режиме как таковая:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...//other code here for showing website labels
//obtain the favicon.ico
if(!this_article.iconLoaded){
this_article.iconLoaded = TRUE;
NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys:this_article, @"article", indexPath, @"indexPath", nil];
[self performSelectorInBackground:@selector(fetchFaviconWrapper:) withObject:args];
}
cell.favicon.image = this_article.icon;
return cell;
}
в FetchFaviconWrapper:
- (void)fetchFaviconWrapper:(NSDictionary *)args {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self fetchFavicon:[args objectForKey:@"article"]];
NSArray *paths = [NSArray arrayWithObject:[args objectForKey:@"indexPath"]];
[articleTable beginUpdates];
[articleTable reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[articleTable endUpdates];
[pool release];
}
По сути, fetchFavicon берет веб-сайт, принимает URL-адрес хоста, добавляет "/favicon.ico", создает его в объект NSData и находит изображение (если оно существует). Тем не менее, это также было довольно ненадежным. Что было бы лучшим способом заменить изображение заполнителя при запуске потока в фоновом режиме? Я мог делать все в главном потоке, но это просто заставляет таблицу загружаться медленно. Кажется, я что-то упускаю из виду или что-то, что просто забыл добавить ... просто не могу понять.