В моем приложении есть функция загрузки множества фото- и видеофайлов в папку 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
Буду признателен, если вы сообщите мне причину или решение этой проблемы.
This method can only be called from inside of
, о каком методе говорит журнал ошибок? - person NSNoob   schedule 15.08.2016PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:fileURL];
- person M.Masa   schedule 15.08.2016changeRequestForAsset:
из блокаperformChanges:
, но вызов также был внутри другого асинхронного блока. Что-то рассмотреть. - person alex-i   schedule 17.12.2018