Мерцание асинхронной загрузки изображения? - PullRequest
2 голосов
/ 06 ноября 2011

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

В любом случае, я сейчас загружаю изображения асинхронно, используя Grand Central Dispatch и Blocks, вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomizedCell";

    CustomizedCell *cell = (CustomizedCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (CustomizedCell *)[nib objectAtIndex:0];

    }



    // Configure the cell...

    cell.Label.text = [self.TitleArray objectAtIndex:indexPath.row];    

       dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
       dispatch_async(queue, ^{
           NSString *String = [[self.Array objectAtIndex:indexPath.row];
           NSURL *url = [NSURL URLWithString:String];
           NSData *Data = [NSData dataWithContentsOfURL:url];
           UIImage *Image = [UIImage imageWithData:Data];
           dispatch_sync(dispatch_get_main_queue(), ^{
               cell.ImageView.image = Image;
           });
       });

Кажется, что загрузка изображений происходит асинхронно, но, как и во всех моих попытках использовать сторонние библиотеки, другой код и т. Д., Изображения мерцают. Под этим я подразумеваю, что при прокрутке изображения ячейки мерцают и переходят в другое изображение другой ячейки, прежде чем быстро переключаться назад, создавая впечатление, будто оно мерцает. Это происходит только при прокрутке и обычно только в верхних двух и двух нижних ячейках. Есть идеи почему? если бы кто-нибудь мог помочь мне с этой проблемой, я был бы очень признателен!

Спасибо!

1 Ответ

2 голосов
/ 06 ноября 2011

Ну, на данный момент никогда не используйте GCD, но я вижу проблему с вашим кодом.

Вы отменяете текущий процесс в любой момент? Я имею в виду, что вы прокручиваете, чтобы просмотреть ячейку других, но уже есть процесс загрузки изображения для ячейки (старой и повторно используемой), не так ли? Может быть, это ваша проблема с "мерцанием".

Если бы вы были, я бы создал подкласс UIImageView и реализовал бы способ отменить текущее соединение, если другое изображение хочет загрузить.

Кстати, вы можете использовать NSOperation & NSOperationQueue, который не использует третью библиотеку.

Удачи.

...