2014-10-16 5 views
7

Перед тем, как загрузить gif изображения и добавить их в коллекцию. gif изображения загружаются хорошо, но когда я пытаюсь прокрутить очень быстро, это крушениеЗагрузите много gif в UICollectionView

Пожалуйста, помогите. У меня есть два решения:

/* 
    cellForGif.layer.borderColor = [[UIColor colorWithRed:54.0/255.f green:56.0/255.f blue:67.0/255.f alpha:1.0]CGColor]; 
    cellForGif.layer.borderWidth = 0.7; 
    FLAnimatedImage __block *gifImage = nil; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%li", (long)indexPath.row] ofType:@"gif"]]]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      cellForGif.gifImage.animatedImage = gifImage; 
      cellForGif.linkOnGif = [self.linksArrayOnGifs objectAtIndex:indexPath.row]; 
      //gifImage = nil; 
     }); 
    }); 
    return cellForGif; 
    */ 
    cellForGif.layer.borderColor = [[UIColor colorWithRed:54.0/255.f green:56.0/255.f blue:67.0/255.f alpha:1.0]CGColor]; 
    cellForGif.layer.borderWidth = 0.7; 
    FLAnimatedImage *gifImage = nil; 
     gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%li", (long)indexPath.row] ofType:@"gif"]]]; 
      cellForGif.gifImage.animatedImage = gifImage; 
      cellForGif.linkOnGif = [self.linksArrayOnGifs objectAtIndex:indexPath.row]; 
      //gifImage = nil; 

    return cellForGif; 
+0

Добавить свой журнал аварий. – Hemang

ответ

3

Необходимо изменить подход.

Необходимо загрузить все изображения, прежде чем устанавливать их в UICollectionViewCell.

Скачано: NSArray содержит все изображения gif. После успешной загрузки изображений установите их в ячейку.

Наблюдая прямо из вашего кода, я вижу, что вы загружаете изображение из основного пакета в методе cellForItemAtIndexPath. Таким образом, очевидно, что это займет некоторое время (nano sec). Но это также значительно значительно, когда в ячейке имеется большой объем данных.

И вполне возможно, что линия

[NSData dataWithContentsOfFile:[[NSBundle mainBundle] 

вернется nil при прокрутке очень быстро.

Добавить комментарий, если он еще не ясен.

EDIT:

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

Также помещается блок try-catch в этот метод, чтобы проверить, что вы пропустили.

cellForGif.layer.borderColor = [[UIColor colorWithRed:54.0/255.f green:56.0/255.f blue:67.0/255.f alpha:1.0]CGColor]; 
    cellForGif.layer.borderWidth = 0.7; 

    @try { 
     FLAnimatedImage __block *gifImage = nil;   
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%li", (long)indexPath.row] ofType:@"gif"]]]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 

       cellForGif.gifImage.animatedImage = gifImage; 
       cellForGif.linkOnGif = [self.linksArrayOnGifs objectAtIndex:indexPath.row]; 
       //gifImage = nil; 
      }); 
     }); 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Exception :%@",exception.debugDescription) 
    } 
+0

Мне нужно в viewDidLoad создать NSArray и нажать на него все мои gif, а затем взять мои gif из этого массива (я не должен брать его из основного пакета) –

+0

Проверьте эту строку 'gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData: [NSData dataWithContentsOfFile : [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat: @ "% li", (long) indexPath.row] ofType: @ "gif"]]]; 'он показывает, что вы извлекаете данные из пути. – Kampai

+0

Да z имеет 84 gifs. Мне нужно в viewDidLoad создать NSArray и вставить в него все мои gif, а затем взять мои gif из этого массива (я не должен брать его из основного пакета). Но этот массив также займет память. И когда я впервые прокручиваю, он не является гладким. (Тогда это нормально) Пожалуйста, скажите мне, возможно, я должен использовать кеш? И я правильно понимаю вас? –

Смежные вопросы