2

загрузить изображение, используя этот код:AFNetworking проблема низкой памяти

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

    NSDictionary *artwork = [self.artworks objectAtIndex:indexPath.item]; 

    collectionViewCell.theImageView.image = nil; 

    if (artwork[@"video_url"]) 
    { 
     UIWebView *webView = (UIWebView *)[collectionViewCell.contentView viewWithTag:100]; 
     NSString * html = [self embedYouTube:artwork[@"video_url"] frame:collectionViewCell.frame]; 

     [webView setHidden:NO]; 

     [webView loadHTMLString:html baseURL:nil]; 

     [collectionViewCell.activityIndicator setHidden:YES]; 
    } 
    else 
    { 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:artwork[@"image_url"]]]; 

     UIImage *cachedImage = [[[UIImageView class] sharedImageCache] cachedImageForRequest:request]; 

     if (cachedImage) 
     { 
      collectionViewCell.theImageView.image = [UIImage scaleImage:cachedImage toWidth:collectionViewCell.frame.size.width]; 
      [collectionViewCell.activityIndicator setHidden:YES]; 
     } 
     else 
     { 
      [collectionViewCell.theImageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 

       // Only update visible cell, to avoid inserting image to another cell. 
       SECustomCollectionViewCell *visibleCollectionViewCell = (id)[collectionView cellForItemAtIndexPath:indexPath]; 

       if (visibleCollectionViewCell) 
       { 
        [visibleCollectionViewCell.theImageView setImage:[UIImage scaleImage:image toWidth:collectionViewCell.frame.size.width]]; 

        [visibleCollectionViewCell.activityIndicator stopAnimating]; 

        [visibleCollectionViewCell.activityIndicator setHidden:YES]; 
       } 

      } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 

      }]; 
     } 
    } 

    return collectionViewCell; 
} 

но занижают проблемы с памятью.

+0

Насколько велик файл? Файлы существенного размера лучше всего загружать потоком непосредственно в файл. В основной теме много вычислений, включая масштабирование изображения. – zaph

+0

@Zaph У меня есть файл jpeg на сервере, который равен 1,4 МБ, но XCode говорит, что там там 70 МБ после загрузки его в изображение. –

+0

Так что это не AFNetworking, а код изображения, вызывающий использование памяти. Насколько большой образ? JPEG или PNG и т. Д. Сжимает изображения, но при создании изображения будет 4 байта на пиксель. Происходит масштабирование, которое также будет использовать память. Вероятно, вы должны добавить пулы автозапуска вокруг методов масштабирования, чтобы память была выпущена раньше. – zaph

ответ

2

Это не AFNetworking, а код изображения, вызывающий использование памяти. JPEG сжимает изображения, но при создании изображения будет 4 байта на пиксель. Так как файл jpeg на сервере, который составляет 1,4 МБ, который загружает все AFNetworking.

Кажется, что вы используете некоторый вспомогательный класс для просмотра этого кода и NSLog - размер фактических данных, загружаемых AFNetworking.

Изображение размером 5407 × 3605 на 4 байта на пиксель создаст изображение более 77 МБ. Вы можете масштабировать его, но сначала выводится исходное изображение, а масштабирование будет использовать больше памяти, потому что в конце вы получите два изображения.

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

Лучше не загружать такое большое изображение в первую очередь.

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