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);
}
}];
});
浙公网安备 33010602011771号