Отставание UICollectionView

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

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
    imageCell *cell = (imageCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    cell.tag = indexPath.row;

    PFObject *temp = [_dataArray objectAtIndex:indexPath.row];
    PFUser *user = [temp objectForKey:@"user"];
    PFFile *file = [temp objectForKey:@"image"];

    [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
        if (!error) {
            cell.selectedImageView.image = [UIImage imageWithData:data];
            self.navigationItem.title = [user objectForKey:@"Name"];
        }
    }];

    return cell;
}

Как видите, я загружаю изображение в фоновом режиме.

Возможно, мне нужно что-то сделать в willDisplayCell?. Спасибо


person Peter    schedule 09.07.2015    source источник


Ответы (2)


Вы загружаете данные каждый раз. попробуй что-нибудь предотвратить.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
    imageCell *cell = (imageCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    ...

    if (cell.selectedImageView.image == nil)
    {
        [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
            if (!error) {
                cell.selectedImageView.image = [UIImage imageWithData:data];
                self.navigationItem.title = [user objectForKey:@"Name"];
            }
        }];
    }

    return cell;
}

Кроме того, иногда это просто в симуляторе. Попробуйте сбросить симулятор или Xcode, а затем снова запустите.

Я сталкивался с тем, что иногда я даже проверял возможную ошибку обработки памяти, но симулятор перезапуска выполнял свою работу.

person 0yeoj    schedule 09.07.2015

На самом деле я никогда раньше не использовал объекты Parse, но похоже, что это потому, что ячейка пытается загрузить несколько изображений одновременно. Я думаю, вам следует переместить логику, которая загружает изображение в ячейку, и отменить загрузку изображения, когда оно повторно используется в prepareForReuse. Эта идея обычно используется, когда вы загружаете изображение в ячейку. Я приведу вам краткий пример, и, надеюсь, он даст вам представление.

в ячейке изображения,

var file: PFFile? {
    didSet {
        if let f = file {
             [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
                if (!error) {
                     selectedImageView.image = [UIImage imageWithData:data];
                }
            }];
        }
    }
}

........

override func prepareForReuse() {
    super.prepareForReuse()
    if let f = file {
       f.cancel()
    }
}

в collectionView: cellForItemAtIndexPath:

.....
cell.file = file
.....
person HMHero    schedule 09.07.2015