如何懒惰地从照片库加载图像?

时间:2014-02-18 18:47:22

标签: ios iphone objective-c

我想懒洋洋地加载图片并在启用分页的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]);
                         }];

    });
}

我知道无法用几行解释。我所要求的只是给我一个提示,以达到我想要的,或者建议我如何以不同的方式做到这一点。非常感谢提前。

1 个答案:

答案 0 :(得分:0)

我的“幻灯片”型显示器存在类似问题。 我的解决方案是枚举目标相册中的资产和每个资产

  • 创建userImage对象并将其添加到NSMutableArray。
  • 将assetURL保存在对象中。
  • 获取宽高比缩略图并将其保存在对象中。
  • 将缩略图放入幻灯片中。

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

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