2
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 枚を取得したいとします。ただし、上記のコードでは、100 件の結果が釣り上げられるのを待つ必要があります。100 枚以上の写真を取得すると、UI の更新が遅くなるため、快適に見えません。どうもありがとう!

何を書けばいいの??

4

2 に答える 2

0

バックグラウンドスレッドでデータベースに保存してみて、CoreData(CoreDataを使用していると仮定)にNSManagedObjectContextDidSaveNotificationを処理してメインスレッドのNSManagedObjectContextを更新させる必要があります。

30枚の写真を保存した後でも保存できます。これにより、I / Oストレスの一部が軽減される可能性がありますが、パフォーマンスをテストする必要があります。

于 2012-07-24T09:19:40.553 に答える
0

これを試してみてください

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

           });
       }
    }

}

if (group!=nil) {

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

              dispatch_async(dispatch_get_global_queue(0, 0), ^{

                    [self saveToDB:self._dataArray];

            });
        } 
于 2013-02-11T01:59:01.947 に答える