【发布时间】:2014-07-01 21:37:58
【问题描述】:
在我的应用程序中,我通过选择器打开相机,拍摄照片后,我想通过以下方法保护资产库。该方法在调用 writeImageToSavedPhotosAlbum 后冻结。
没有信号量,这些方法可以完美运行。但是我错过了收到assetURL。
+ (NSURL*)safeImageToAssetsLibrary:(UIImage *)image metadata:(NSDictionary *)metadata
{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
__block NSURL *retAssestURL = nil;
dispatch_semaphore_t semaWaitingForSafeImage = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// safe the image to the assests library
NSLog(@"Safe image to asssets library...");
dispatch_async(queue, ^{
[library writeImageToSavedPhotosAlbum:image.CGImage metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"Image could not be safed to the assets library: %@", error);
retAssestURL = nil;
}
else {
NSLog( @"Image safed successfully to assetURL: %@", assetURL);
retAssestURL = assetURL;
}
dispatch_semaphore_signal(semaWaitingForSafeImage);
}];
});
dispatch_semaphore_wait(semaWaitingForSafeImage, DISPATCH_TIME_FOREVER);
return retAssestURL;
}
这是我调用safeImageToAssetsLibrary方法的方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:NULL];
// get chosen image and add thumbnail to collection view
NSURL *imageUrl = info[UIImagePickerControllerReferenceURL];
UIImage *chosenImage = info[UIImagePickerControllerOriginalImage];
// safe image to photo library if the camera has been used
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
imageUrl = [BaseImageHandler safeImageToAssetsLibrary:chosenImage metadata:info[UIImagePickerControllerMediaMetadata]];
}
// UPDATE View and Core Data here...
}
【问题讨论】:
-
最好重构你的代码来处理方法的异步特性。不要阻止并将 URL 作为返回值返回,而是在您的方法中使用完成块。
-
我不确定。你到底是什么意思?我应该为 safeImageToAssetsLibrary 实现第二个完成块吗?
-
没错。您的
saveImageToAssetsLibrary方法应将完成块作为参数。您可以从writeImageToSavedPhotosAlbum的完成块中调用它。
标签: objective-c ios7 semaphore alassetslibrary