【问题标题】:ALAssetsLibrary is too slow - Objective-CALAssetsLibrary 太慢 - Objective-C
【发布时间】:2012-10-22 09:18:30
【问题描述】:

从相机胶卷中加载 10-20 张全屏图像、保存照片的快速方法是什么?

我正在使用此代码,但要加载 10 张照片,我需要等待大约 5-10 秒。我用的是 iPhone 4S。

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if(_savedPhotos.count>=11) *stop = YES;
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *needToStop) {
        NSLog(@"%d",index);
        if(_savedPhotos.count<11)
        {
            UIImage *image = [UIImage imageWithCGImage:result.defaultRepresentation.fullScreenImage];
            [_savedPhotos addObject:image];
        }
        else
        {
            *needToStop = YES;
        }
    }];
} failureBlock:^(NSError *error) {
    NSLog(@"%@",error.description);
}];

【问题讨论】:

    标签: iphone objective-c ios alassetslibrary


    【解决方案1】:

    ALAssetsLibrary 库将在单独的 线程上运行。所以与UI相关的东西和其他东西沟通可能需要一些时间。

    所以在 ALAssetsLibrary 块中使用 -performSelectorOnMainThread:withObject:waitUntilDone:

    如下更改您的代码

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *needToStop) {
                NSLog(@"%d",index);
                UIImage *image = [UIImage imageWithCGImage:result.defaultRepresentation.fullScreenImage];
                [self performSelectorOnMainThread:@selector(usePhotolibraryimage:) withObject:image waitUntilDone:NO];
            }];
        }
    
        failureBlock:^(NSError *error) {
               NSLog(@"%@",error.description);
        }];
    
    - (void)usePhotolibraryimage:(UiImage *)myImage{
    
        //Do your all UI related and all stuff here
    }
    

    注意:看this issue too

    【讨论】:

    • 我已经实现了您的代码并将全屏图像更改为缩略图,并将 ALAsset *result 保存到 NSMutableArray,并在需要时访问它。它速度更快,占用的内存更少。
    • 您不想手动将图像转换为缩略图.. ALAssetsLibrary 将直接提供缩略图
    • LAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { CGImageRef iref = [myasset thumbnail]; if (iref) { importMediaSaveImage.image = [UIImage imageWithCGImage:iref]; }
    • 也请在这里查看我的问题stackoverflow.com/questions/11580918/…
    • 需要注意的一点:如果您的用户尚未授予照片权限,他们将在第一次通过 UIAlertView 进行询问。这必须在主线程上。所以考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多