2014-02-18 2 views
1

Я хотел бы загружать изображения лениво и отображать их в scrollview, в котором пейджинг включен. Загрузка всех изображений одним выстрелом приводит к сбою приложения, поскольку я загружаю fullScreenImage. Его работа отлично, если я загружаю уменьшенное изображение с использованием aspectRatioThumbnail, но качество изображения хуже. Поэтому я хочу загружать изображения только для видимых страниц вместо загрузки всего за раз. Если я знаю, как лениво загружать изображения из библиотеки фотографий, я могу отображать изображения, используя только три страницы. ниже мой код ...Как загрузить изображения из библиотеки фотографий лениво?

-(void)loadImagesFromLibrary{ 

    imageList = [[NSMutableArray alloc] init]; 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    CGFloat __block xaxis=05; 
    NSUInteger __block images = 0; 

    dispatch_queue_t queue = dispatch_get_main_queue(); 
    dispatch_async(queue, ^(void){ 

    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
          usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 

           if(group){ 

            [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 

            [group enumerateAssetsUsingBlock:^(ALAsset *assets, NSUInteger index, BOOL *innerStop){ 

             if (assets && [[assets valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) 
             { 
              //ALAssetRepresentation *representation = [assets defaultRepresentation ]; 
              //UIImage *img = [UIImage imageWithCGImage:[representation fullScreenImage]]; 

              UIImage *img = [UIImage imageWithCGImage:[assets aspectRatioThumbnail]]; 
              if(img){ 

               [imageList addObject:img]; 

               UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(xaxis, 5, 300, HEIGHT)]; 
               [imageView setImage:[self rectSizeFormat:img Size:CGSizeMake(300, HEIGHT)]];  //resizing the image 
               [imageView setTag:images++]; 
               [imageView setUserInteractionEnabled:YES]; 

               UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(displayImageInMiddleView:)]; 
               [tapGesture setNumberOfTapsRequired:1]; 
               [imageView addGestureRecognizer:tapGesture]; 
               [tapGesture release]; 

               [scrollView addSubview: imageView]; 
               [imageView release]; 

               xaxis+=320; 

              } 
             } 
            }]; 

            [scrollView setContentSize:CGSizeMake(xaxis, HEIGHT)]; 
           } 
           else{ 

            DLog(@"No image"); 
           } 

          } 

         failureBlock:^(NSError *err) { 

          DLog(@"%@", [err localizedDescription]); 
         }]; 

    }); 
} 

Я знаю, что это не может быть объяснено в нескольких строках. Все, что я прошу, это дать мне намек на то, что я хочу, или предложить мне, как я могу это сделать по-другому. Спасибо заранее.

ответ

0

У меня подобная проблема с дисплеем типа «диафильм». Мое решение перечислить средства в моей целевой альбом, и для каждого из них

  • Создание объекта userImage и добавить его к NSMutableArray.
  • Сохраните объект asset в объекте.
  • Получите эскиз пропорции и сохраните его в объекте.
  • Поместите уменьшенное изображение в диафильм.

Когда мне нужна версия с высоким разрешением каждого изображения диафильма, я запускаю запрос async для загрузки полноразмерного изображения с помощью сохраненного ресурсаURL. Конечно, это асинхронно, поэтому вам нужно иметь место в пользовательском интерфейсе (UIImageView в моем случае), чтобы поместить изображение, когда оно наконец поступит из библиотеки активов. Перед загрузкой полноразмерного изображения я показываю миниатюру в том же UIImageView (с привязкой по масштабу).

Асинхронный характер нагрузок изображения - это настоящая досада.

+0

Спасибо за ваше предложение. Я столкнулся с странной проблемой. Я выбираю и показываю изображения в разных ViewController при нажатии кнопки. После третьего посещения страницы я получаю предупреждение о памяти. Я правильно обработал память. Я не понял, почему это происходит? Есть ли у вас какие-либо идеи, что может привести к сбою приложения после определенного посещения? Есть ли общая ошибка/исключения, которые необходимо обрабатывать при использовании библиотеки активов? – Alex

+0

Короткий ответ заключается в том, что вы используете слишком много памяти. Я считаю, что инструменты Инструменты трудно использовать, но вы можете * посмотреть, не держитесь ли вы за то, что вы не имеете в виду. Возможно, вы просто создаете слишком много изображений в памяти за один раз. Даже два больших изображения могут вызвать предупреждение о памяти. Вы можете увидеть общее использование памяти, запустив приложение с Xcode (симулятор или на устройстве) с помощью «отладочного навигатора», видимого на панели отладки слева (6-й навигатор из 8). –

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