Асинхронная загрузка изображения мерцает?

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

В любом случае, в настоящее время я загружаю изображения асинхронно, используя 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;
           });
       });

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

Спасибо!


person ApiMail    schedule 06.11.2011    source источник


Ответы (1)


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

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

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

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

Удачи.

person Vinzius    schedule 06.11.2011
comment
Спасибо за ответ! Я не думал об этом, однако есть ли причина, по которой это происходит только для первых двух и последних двух? Я попытался использовать NSOperation и попытался создать подкласс uiimageview, но все еще имею ту же проблему. Я не пытался отменить соединение, хотя у меня на экране одновременно только восемь ячеек, было бы лучше не использовать их повторно в этом случае. Спасибо еще раз! - person ApiMail; 06.11.2011
comment
Что ж, вы можете попытаться не использовать их повторно, чтобы избежать проблемы (я думаю, это не очень хороший способ: p). Но я думаю, что это ваша проблема ^^ Других причин не вижу. Может быть, после того, как есть какой-то кеш, чтобы вы больше не видели проблему. Вы должны попробовать с большим количеством ячеек... ^^ Но если вы сделаете это снова с помощью NSOperation и отмените операцию при загрузке другого изображения, у вас не должно возникнуть никаких проблем. Удачи. - person Vinzius; 06.11.2011