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, который загружает изображение по запросу и публикует уведомление, когда оно приходит:

https://github.com/mattneub/Programming-iOS-4-Book-Examples/blob/master/p754p772downloader/p754downloader/MyImageDownloader.m

Источник данных табличного представления предоставляет заполнитель, если MyImageDownloader не имеет изображения, и предоставляет изображение, если оно есть:

https://github.com/mattneub/Programming-iOS-4-Book-Examples/blob/master/p754p772downloader/p754downloader/RootViewController.m

Таким образом, все, что нам нужно сделать, это перезагрузить таблицу, когда изображение прибывает. м.

Вы можете выполнить загрузку изображения в другом потоке, чтобы он не блокировал основное. Вы можете сделать это так:

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

    });
});

Поэтому вам нужно переключиться на другой поток для загрузки, а затем вернуться к основному потоку и добавить их в пользовательский интерфейс. Элементы пользовательского интерфейса должны обрабатываться только в основном потоке.

Другие вопросы по тегам