CollectionView дергается/заикается при прокрутке

У меня есть UICollectionView, который показывает список плейлистов и изображение одной из песен в плейлисте.

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; {

    playlistCell*    cell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

    if(!cell)
    {
        cell = [[playlistCell alloc] init];
    }

    // Configure the cell...

    MPMediaItem *rowItem = [[playlists objectAtIndex:indexPath.row] representativeItem];

    UIImage *cellBG = [self getAlbumArtworkWithSize:CGSizeMake(320, 320) forPlaylist:[playlists objectAtIndex:indexPath.item]];

    cell.image = cellBG;

    return cell;
}

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

Как бы мне сделать это более плавным?


person WunDaii    schedule 26.05.2014    source источник
comment
Вы загружаете сюда изображения из интернета?   -  person E-Riddie    schedule 26.05.2014
comment
Может быть, getAlbumArtworkWithSize: делает что-то тяжелое, код?   -  person Jkmn    schedule 26.05.2014
comment
Нет, поэтому я не могу найти никакого решения. Все решения обычно связаны с извлечением изображений из Интернета.   -  person WunDaii    schedule 26.05.2014
comment
@Jkmn Но, конечно же, после загрузки изображения ему не нужно снова перезагружать его из getAlbumArtworkWithSize?   -  person WunDaii    schedule 26.05.2014
comment
Ну, getAlbumArtworkWithSize: будет вызываться много раз, каждый раз, когда ячейка, которая была за кадром, появляется на экране.   -  person Jkmn    schedule 26.05.2014
comment
@Jkmn Ах, черт возьми. Есть ли способ временно сохранить его, чтобы ему не приходилось каждый раз вызывать метод?   -  person WunDaii    schedule 26.05.2014


Ответы (1)


Вы можете сделать пользовательский интерфейс более отзывчивым, просто загрузив изображения в фоновом режиме с помощью GCD следующим образом:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; {

    playlistCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

    if(!cell)
    {
        cell = [[playlistCell alloc] init];
    }

    // Configure the cell...
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        MPMediaItem *rowItem = [[playlists objectAtIndex:indexPath.row] representativeItem];
        UIImage *cellBG = [self getAlbumArtworkWithSize:CGSizeMake(320, 320) forPlaylist:[playlists objectAtIndex:indexPath.item]];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.image = cellBG;
        });
    });
    return cell;
}
person Jack    schedule 26.05.2014