Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ALAssets groups enumeration: how to check for completion?

ALAssets use a separated thread to manage enumeration, i have to know when enumeration terminate.

The block prototype for group enumeration is :

typedef void (^ALAssetsLibraryGroupsEnumerationResultsBlock)(ALAssetsGroup *group, BOOL *stop);

How can i add a completion block ?

like image 699
MatterGoal Avatar asked Apr 28 '11 12:04

MatterGoal


2 Answers

I found a solution that is documented only in part.

When group enumeration is terminated, ALAssetsLibraryGroupsEnumerationResultsBlock is invoked with group=nil. So you can write something like:

void (^groupsEnumerator)(ALAssetsGroup *,BOOL *) = ^(ALAssetsGroup *group, BOOL *stop){ 
    if (group != nil) {
        [group enumerateAssetsUsingBlock:assetsEnumerator];

    }else {
        NSLog(@"group enumeration terminated");
    }
}; 

The same solution is valid for assets enumeration (this is not documented -.- )

 void (^assetsEnumerator)(ALAsset *,NSUInteger,BOOL*) = ^(ALAsset *result, NSUInteger index, BOOL *stop){    
    if (result !=nil) {
       //do something with result asset

    }else {
        NSLog(@"Assets enumeration terminated");
    }
};
like image 66
MatterGoal Avatar answered Oct 23 '22 21:10

MatterGoal


I'm using this:

        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

        if (result == nil) {
            return;
        }

        if (index + 1 == group.numberOfAssets) {
        //Do what you want. Im using delegate to notify my parent class about finish.
            [delegate didGroupEnumerated:group];
        }

    }];
like image 28
tier777 Avatar answered Oct 23 '22 21:10

tier777