8

我的应用程序具有下载 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'

此外,我通过 NSLog 确认了 tmp 文件夹中视频文件的 fileURL,并且在'performChanges'块的外部和内部都可以。

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

如果您能告诉我此问题的原因或解决方案,我将不胜感激。

4

0 回答 0