tzjut

导航

AssetsLibrary操作的一个简单封装

项目中有个需求,需要将图片保存到自己独立的相册(ALAssetsGroup)。

其中两个地方涉及到AssetsLibrary和ALAssetsGroup的操作:

  1 读取此相册中最后一张thumbnail, 进行显示

  2 将image对像保存到相册中。

对于AssetsLibrary的使用,因为保证对象的生命周期长于其他相关的对象,所以使用单例模式是最简单,也是最合理的封装。

+(ALAssetsLibrary *)defaultAssetsLibrary{
    static dispatch_once_t pred = 0;
    static ALAssetsLibrary *library = nil;
    dispatch_once(&pred, ^{
        library = [[ALAssetsLibrary alloc] init];
    });
    return library;
}

 对于ALAssetsGroup,也在工具类里,使用了一个单例模式进行封装,方便其他地方的调用

封装的关键在于信号量的使用,把异步操作变成同步的操作。

+(ALAssetsGroup*)SelfPortraitGroup
{
    static  ALAssetsGroup *group;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
        

    
        dispatch_async(dispatch_queue_create("enum assets queue", nil), ^{
        
            [[Util defaultAssetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *g, BOOL *stop) {
                if (g==nil) {
                    dispatch_semaphore_signal(semaphore);
                }
                
                NSString *groupName = [g valueForProperty:ALAssetsGroupPropertyName];
                if([groupName isEqualToString:SelfCameraAlbumName]) {
                    group = g;
                    *stop = YES;
                    dispatch_semaphore_signal(semaphore);
                }
                
                
            } failureBlock:^(NSError* err){
                dispatch_semaphore_signal(semaphore);
                NSLog(@"enumerate ALAssetsLibrary fail :%@",err);
            }];
        });
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        
        if (group == nil) {
            dispatch_async(dispatch_queue_create("add assets queue", nil), ^{
                [[Util defaultAssetsLibrary] addAssetsGroupAlbumWithName:SelfCameraAlbumName resultBlock:^(ALAssetsGroup *g){
                    group = g;
                    dispatch_semaphore_signal(semaphore);
                } failureBlock:^(NSError *error) {
                    NSLog(@"addAssetsGroupAlbumWithName fail:%@",error);
                    dispatch_semaphore_signal(semaphore);
                }];
            });
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        }
    });
    return group;
}

 

有了以上两个封装后,保存图片的过程就显的简洁了:

  dispatch_queue_t t = dispatch_queue_create("save queue", nil);
    dispatch_async(t, ^{
        ALAssetsGroup* group = [Util SelfPortraitGroup];
        assert(group);
        [[Util defaultAssetsLibrary] writeImageToSavedPhotosAlbum:self.image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
            if (nil == error && assetURL){
                [[Util defaultAssetsLibrary] assetForURL:assetURL resultBlock:^(ALAsset *asset) {
                  BOOL b =  group.isEditable;
                    b = [group addAsset:asset];
                 
                } failureBlock:^(NSError *error) {
                    NSLog(@"assetForURL:%@",error);
                }];
            }
            if (error){
                NSLog(@"writeImageToSavedPhotosAlbum:%@",error);
            }
        }];

    });

 

 

posted on 2013-07-12 17:53  tzjut  阅读(323)  评论(0)    收藏  举报