• параметр, указывающий селектор (этот селектор будет вызываться применительно к целевому объекту). Данный параметр идет вторым, а селектор вызывается по завершении операции;
• значение контекста, передаваемое указанному селектору, как только операция будет завершена.
Второй, третий и четвертый параметры для этой процедуры указывать не обязательно. Если вы зададите и второй, и третий параметры, то четвертый параметр все равно останется опциональным. Вот, например, селектор, который я выбрал для нашего примера:
— (void) imageWasSavedSuccessfully:(UIImage *)paramImage
didFinishSavingWithError:(NSError *)paramError
contextInfo:(void *)paramContextInfo{
if (paramError == nil){
NSLog(@"Image was saved successfully.");
} else {
NSLog(@"An error happened while saving the image.");
NSLog(@"Error = %@", paramError);
}
}
Если вы попытаетесь воспользоваться процедурой UIImageWriteToSavedPhotosAlbum для сохранения фотоснимка в пользовательской библиотеке фотографий и приложение впервые выполняет эту операцию на данном устройстве, то iOS запросит у пользователя разрешение на такую операцию (рис. 13.1). Таким образом, пользователь может позволить или не позволить приложению сохранять фотографии на устройстве. В конце концов, это пользовательское устройство и мы не можем делать на этом устройстве ничего такого, чего нам не разрешил пользователь. Если пользователь дает разрешение, то процедура UIImageWriteToSavedPhotosAlbum продолжит сохранение изображения. Если разрешение не получено, то селектор обработчика завершения по-прежнему будет вызываться, но параметр didFinishSavingWithError этого селектора будет устанавливаться в валидный экземпляр ошибки.
Рис. 13.1. iOS запрашивает у пользователя права доступа, прежде чем программа сможет сохранить снимок в библиотеке фотографий
Теперь, если пользователь отказывает приложению в праве доступа, все последующие вызовы процедуры UIImageWriteToSavedPhotosAlbum будут неуспешными, пока пользователь вручную не изменит настройки своего устройства (рис. 13.2).
Рис. 13.2. Приложению не разрешен доступ к пользовательской библиотеке фотографий
Если в данном селекторе вы получаете параметр error, значение которого равно nil, это означает, что изображение было успешно сохранено в пользовательской библиотеке фотографий. В противном случае можно получить значение данного параметра, чтобы выяснить, в чем заключается ошибка.
13.5. Сохранение видео в библиотеке фотографий
Постановка задачи
Требуется сохранить в библиотеке фотографий видеоролик, доступный по URL, например ролик из пакета вашего приложения.
Решение
Воспользуйтесь методом экземпляра writeVideoAtPathToSavedPhotosAlbum: completionBlock:, относящимся к классу ALAssetsLibrary:
#import «AppDelegate.h»
#import
@interface AppDelegate ()
@property (nonatomic, strong) ALAssetsLibrary *assetsLibrary;
@end
@implementation AppDelegate
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.assetsLibrary = [[ALAssetsLibrary alloc] init];
NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"MyVideo"
withExtension:@"MOV"];
if (videoURL!= nil){
[self.assetsLibrary
writeVideoAtPathToSavedPhotosAlbum: videoURL
completionBlock: ^(NSURL *assetURL, NSError *error) {
if (error == nil){
NSLog(@"no errors happened");
} else {
NSLog(@"Error happened while saving the video.");
NSLog(@"The error is = %@", error);
}
}];
} else {
NSLog(@"Could not find the video in the app bundle.");
}
return YES;
}
Обсуждение