首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ALAssetLibrary获取相机胶卷中的本地照片

如何使用ALAssetLibrary获取相机胶卷中的本地照片
EN

Stack Overflow用户
提问于 2012-06-19 11:15:16
回答 2查看 2.5K关注 0票数 2
代码语言:javascript
复制
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                           usingBlock:libraryGroupsEnumeration 
                         failureBlock:failureblock];
ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){
        if (result!=NULL) {

            if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {

                [self._dataArray addObject:result];
            }

        }
    };

ALAssetsLibraryGroupsEnumerationResultsBlock
    libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){
        //within the group enumeration block.filter to enumerate just photos.
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        if (group!=nil) {
            NSString *g=[NSString stringWithFormat:@"%@",group];
            NSLog(@"gg:%@",g);//gg:ALAssetsGroup - Name:Camera Roll, Type:Saved Photos, Assets count:71
            [group enumerateAssetsUsingBlock:groupEnumerAtion];
        }
        else {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                [self saveToDB:self._dataArray];

            });
        }

    };

假设我的相机卷有100张照片,我想在上面的代码中获得前30张照片保存到我的database.but中,我必须等待100个结果fisishing.After 30写入数据库,继续获得另外30张,直到结束。因为获取100张甚至更多的照片会延迟我的UI,所以refresh.It看起来并不舒服。非常感谢!

我该写些什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-11 09:59:02

试试这个

代码语言:javascript
复制
if (result!=NULL) {

    if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto])         {

          [self._dataArray addObject:result];

            if([self._dataArray count] == 30){

               dispatch_async(dispatch_get_global_queue(0, 0), ^{

                 NSArray *array = [[NSArray alloc] initWithArray:self._dataArray]; //please change the array declaration to top of this method. Because the Block will not allow to do it here.               
                 [self._dataArray removeAllObjects];
                 [self saveToDB:array];
                 //array release,if not using ARC

           });
       }
    }

}

代码语言:javascript
复制
if (group!=nil) {

            [group enumerateAssetsUsingBlock:groupEnumerAtion];
        }
        else if([self._dataArray count] > 0) {

              dispatch_async(dispatch_get_global_queue(0, 0), ^{

                    [self saveToDB:self._dataArray];

            });
        } 
票数 0
EN

Stack Overflow用户

发布于 2012-07-24 17:19:41

您应该尝试保存到后台线程上的数据库,并让CoreData (假设您使用CoreData)通过处理NSManagedObjectContextDidSaveNotification来更新主线程上的NSManagedObjectContext。

你仍然可以在30张照片后保存,这可能会减轻一些I/O压力,但你必须测试性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11093913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档