【问题标题】:How to Load images from photo library lazily?如何懒惰地从照片库中加载图像?
【发布时间】:2014-02-18 18:47:22
【问题描述】:

我想延迟加载图像并将其显示在启用分页的滚动视图中。一次加载所有图像会导致应用程序崩溃,因为我正在加载 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]);
                         }];

    });
}

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

【问题讨论】:

    标签: ios iphone objective-c


    【解决方案1】:

    “幻灯片”类型的显示器也有类似的问题。 我的解决方案是枚举我的目标专辑中的资产以及每个资产

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

    当我需要每个幻灯片图像的更高分辨率版本时,我会发出一个异步请求,以使用保存的资产 URL 加载完整尺寸的图像。当然,这是异步的,因此您必须在 UI 中(在我的情况下为 UIImageView)中放置一个位置,以便在图像最终从资产库到达时放置图像。在加载完整尺寸的图像之前,我在同一个 UIImageView 中显示缩略图(使用 scale-aspect-fit)。

    图片加载的异步特性确实令人烦恼。

    【讨论】:

    • 感谢您的建议。我面临一个奇怪的问题。我在单击按钮时在不同的 ViewController 中获取和显示图像。第三次访问该页面后,我收到了内存警告。我已经正确处理了内存。我没明白为什么会这样?你有什么想法,是什么导致应用程序在某些访问后崩溃?使用资产库时是否有任何常见的错误/异常需要处理?
    • 简短的回答是您使用了太多内存。我发现 Instruments 工具很难使用,但你可以看看你是否坚持了你不想要的东西。可能您只是一次创建了太多内存中的图像。即使是两个大图像也会导致内存警告。您可以通过在 Xcode(模拟器或设备上)运行应用程序来查看您的总内存使用情况,左侧调试面板中可见“调试导航器”(8 个导航器中的第 6 个)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多