我的应用程序具有下载 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
如果您能告诉我此问题的原因或解决方案,我将不胜感激。