Исключение при сохранении большого количества файлов с помощью PHPhotoLibrary API

В моем приложении есть функция загрузки множества фото- и видеофайлов в папку tmp и сохранение их в фотопленке с помощью PHPhotoLibrary API.

Проблема в том, что иногда (вероятность около 10%) происходит исключение в процессе сохранения.

Сообщение об ошибке в консоли:

Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Этот метод может быть вызван только изнутри -[PHPhotoLibrary PerformChanges:completionHandler:] или -[PHPhotoLibrary PerformChangesAndWait:error:]»

Мой код выглядит следующим образом:

- (void)saveVideoFileInCameraRoll:(NSString *)videoFilePath
{
    NSURL *videoFileUrl = [NSURL fileURLWithPath:videoFilePath];

    photoLibrarySaveImageCompletion completion = ^(BOOL success, NSError *error) {
        NSLog(@"success=%@, error=%@", (success ? @"YES" : @"NO"), error);
    };

    NSLog(@"videoFileUrl=%@", videoFileUrl);

    [self saveVideoFile:videoFileUrl completion:completion];
}

- (void)saveVideoFile:(NSURL *)fileURL completion:(photoLibrarySaveImageCompletion)completion
{
    NSLog(@"fileURL=%@", fileURL);

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        NSLog(@"fileURL=%@", fileURL);

        // Exception happens on this line as [SIGABRT]
        PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:fileURL]; 

        if (_assetCollection) {
            PHAssetCollectionChangeRequest *assetCollectionChangeRequest =
                [PHAssetCollectionChangeRequest changeRequestForAssetCollection:self.assetCollection];
            [assetCollectionChangeRequest addAssets:@[ [assetChangeRequest placeholderForCreatedAsset] ]];
        }
        else {
            NSLog(@"### assetCollection is nil ###");
        }
    }

        completionHandler:^(BOOL success, NSError *_Nullable error) {
            NSLog(@"success=%@, error=%@", (success ? @"YES" : @"NO"), error);

            completion(success, error);
        }];
}

Я проверил аналогичный случай:

Сохранить изображение в фотобиблиотеке с помощью фоторамки

Кейс каждый раз вылетает, но мой код вылетает редко.

И в отличие от случая, когда я звоню

[PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:]

в 'performChanges' блоке

Также я подтвердил файловый URL-адрес видеофайла в папке tmp с помощью NSLog, и все в порядке снаружи и внутри блока 'performChanges'.

fileURL=file:///private/var/mobile/Containers/Data/Application/C87F0F75-E128-4E9F-AE07-6B914939AC5D/tmp/video3.mp4

Буду признателен, если вы сообщите мне причину или решение этой проблемы.


person M.Masa    schedule 15.08.2016    source источник
comment
This method can only be called from inside of, о каком методе говорит журнал ошибок?   -  person NSNoob    schedule 15.08.2016
comment
@NSNoob Метод PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:fileURL];   -  person M.Masa    schedule 15.08.2016
comment
Вы нашли решение? У меня точно такая же проблема   -  person lithium    schedule 01.12.2016
comment
@литий Пока нет. Я просто избегаю этой проблемы, пытаясь поймать и повторить попытку. Но после этого остается возможность другой проблемы сбоя.   -  person M.Masa    schedule 02.12.2016
comment
@M.Masa M.Masa У меня похожая проблема, ты нашел какое-нибудь решение?   -  person reetu    schedule 22.06.2017
comment
@reetu Я пока не могу найти решение. Прежде чем я задал этот вопрос через TSI Apple (Инцидент технической поддержки). Наконец, они попросили меня прислать вам мой исходный код. Но я не мог, потому что весь код моего приложения очень большой и сложный, и сложно выделить проблемную часть из всего кода. Спасибо.   -  person M.Masa    schedule 05.07.2017
comment
У меня возникла ошибка при вызове changeRequestForAsset: из блока performChanges:, но вызов также был внутри другого асинхронного блока. Что-то рассмотреть.   -  person alex-i    schedule 17.12.2018