2014-02-18 52 views
1

我想懒惰地加载图像并在启用了分页的滚动视图中显示它。当我加载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。
  • 将assetURL保存在对象中。
  • 获取纵横比缩略图并将其保存在对象中。
  • 将缩略图放入胶片。

当我需要每个幻灯片图像的高分辨率版本时,我使用保存的assetURL启动异步请求以加载完整大小的图像。当然,这是异步的,所以你必须在UI中有一个位置(在我的情况下是UIImageView),以便当它最终从资产库到达时放置图像。在加载完整大小的图像之前,我将缩略图显示在同一个UIImageView中(使用scale-aspect-fit)。

图像加载的异步性质是一个真正的烦恼。

+0

感谢您的建议。我正面临一个奇怪的问题。我通过点击按钮在不同的ViewController中获取并显示图像。第三次访问该页面后,我收到内存警告。我正确处理了内存。我没有得到它发生的原因?你有什么想法,是什么导致应用程序在访问后崩溃?使用资产库时是否有任何常见错误/异常需要处理? – Alex

+0

简短的回答是你使用的内存太多。我发现这些乐器工具很难使用,但是你可以*看看你是否坚持你不想要的东西。可能你只是一次创建太多内存中的图像。即使两张大图也会引起记忆警告。通过在调试面板左侧显示“调试导航器”(第8个导航器中的第8个导航器),可以通过从Xcode(模拟器或设备)运行应用程序来查看总内存使用情况。 –