Ошибка PHAssetChangeRequest для UIImage, снятого камерой

У меня возникла проблема с реализацией камеры View Controller для приложения iOS, над которым я работаю. Когда нажимается кнопка, у меня есть одноэлементный объект камеры, который управляет стороной AVFoundation и захватывает изображение. Как вы можете видеть ниже, как только UIImage будет захвачен с камеры, я передаю блок завершения, который его использует.

Первый метод ниже - это действие, которое срабатывает при нажатии кнопки захвата на камеру. Во-первых, слой камеры приостанавливается отключением соединения на уровне предварительного просмотра, после чего изображение захватывается. Затем объект камеры захватывает UIImage, после чего я удаляю слой предварительного просмотра камеры из представления и вместо этого добавляю подкассету UIImageView с захваченным изображением на своем месте.

Затем я хочу добавить изображение в альбом, который я создал в Фото, используя фреймворк. Я могу создать альбом без проблем, и я подтвердил, что объект PHAssetCollection. Я использую во втором методе правильный.

По какой-то причине, однако, я не могу добавить запись UIImage я в альбом. Я попытался добавить в альбом случайный файл изображения, который был у меня в моем проекте, и операция завершилась успешно. Я также подтвердил, что правильное изображение успешно передается методу addPhotoToSavedPhotos с помощью операторов NSLog для проверки описания изображения в обоих методах. Это заставляет меня поверить, что что-то не так с изображением, но ImageView успешно отображает его, поэтому я не уверен, что это может быть.

Если у кого-нибудь есть идеи решений, которые я могу попробовать, я был бы признателен. Также error.localizedDescription из оператора NSLog во втором методе выводит "The operation couldn't be completed. (Cocoa ошибка -1). "

- (IBAction)capturePhoto:(id)sender {

    [self pauseCameraLayer];
    [[eventCamera sharedInstance] captureStillUIImage:^(UIImage *image, NSError *error){

        if(error)
        {
            NSLog(@"error capturing photo");
        }
        else
        {
            NSLog(@"%@",image.debugDescription);
        }
        [_captureButton setHidden:YES];
        [_switchCameraButton setHidden:YES];
        UIImageView *preview=[[UIImageView alloc] initWithImage:image];
        [preview setAutoresizesSubviews:YES];
        [preview setContentMode:UIViewContentModeScaleAspectFit];
        [preview setTransform:CGAffineTransformMakeRotation(M_PI_2)];
        preview.frame=_imageView.bounds;
        [_imageView addSubview:preview];
        [self addPhotoToSavedPhotos:[image copy]];
        NSLog(@"1: %@",image.description);
    }];

-(void)addPhotoToSavedPhotos:(UIImage*)photo
{
    PHAssetCollection *myCollection=[self getAPPCollection];
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        //Perform changes to photo library

        PHAssetChangeRequest *req=[PHAssetChangeRequest creationRequestForAssetFromImage:photo];
        PHAssetCollectionChangeRequest *assetChangeRequest=[PHAssetCollectionChangeRequest changeRequestForAssetCollection:myCollection];
        [assetChangeRequest addAssets:[NSArray arrayWithObject:req.placeholderForCreatedAsset]];
        //[libReq addAssets:@[assetPlaceHolder]];

    }completionHandler:^(BOOL success, NSError *error){
        //Perform any necessary actions after adding the photo to the photo 
        //library
        if(!success)
        {
            NSLog(@"didn't succeed, error: %@",error.localizedDescription);
        }
    }];
}

Ответ 1

Попробуйте что-то вроде этого Этот код будет проверять текущий альбом Exist или не первый

  #import <Photos/Photos.h>

    - (void)addPhotoToSavedPhotos:(UIImage *)image {
        NSString *albumName = @"NameOFTheAlbum";

        void (^saveBlock)(PHAssetCollection *assetCollection) = ^void(PHAssetCollection *assetCollection) {
            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
                PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
                [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];

            } completionHandler:^(BOOL success, NSError *error) {
                if (!success) {
                    NSLog(@"Error creating asset: %@", error);
                }
            }];
        };

        PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
        fetchOptions.predicate = [NSPredicate predicateWithFormat:@"localizedTitle = %@", albumName];
        PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
        if (fetchResult.count > 0) {
            saveBlock(fetchResult.firstObject);
        } else {
            __block PHObjectPlaceholder *albumPlaceholder;
            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName];
                albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection;

            } completionHandler:^(BOOL success, NSError *error) {
                if (success) {
                    PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil];
                    if (fetchResult.count > 0) {
                        saveBlock(fetchResult.firstObject);
                    }
                } else {
                    NSLog(@"Error creating album: %@", error);
                }
            }];
        }
    }

Ответ 2

PHAssetChangeRequest открывает диалоговое окно с разрешением. Пользовательский интерфейс всегда должен быть в основном потоке.

Попробуйте переместить PHAssetChangeRequest из обратного вызова.