您好我正在开发一个 iphone 应用程序,它创建一个 AVAssetExportSession 对象来保存和创建一个视频文件。一切正常,(文件已创建并正确保存在文档文件夹中),除非我尝试恢复保存过程。如果我按下主页按钮退出应用程序(或者如果我收到电话或短信),则方法 exportAsynchronouslyWithCompletionHandler 失败。苹果的文档说:
“如果您尝试覆盖现有文件或在应用程序的沙箱之外写入文件,则导出将失败。如果您需要覆盖现有文件,则必须先将其删除。如果出现以下情况,导出也可能会失败:
有来电
您的应用程序在后台,另一个应用程序开始播放
在这些情况下,您通常应该通知用户导出失败,然后允许用户重新启动导出。”
所以我尝试取消导出,然后在用户重新打开应用程序时重新启动它。第二次调用 exportAsynchronouslyWithCompletionHandler 时出现此错误:
“由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法调用exportAsynchronouslyWithCompletionHandler:不止一次。'”
似乎 [asset CancelExport] exportAsynchronouslyWithCompletionHandler 保持活动状态后,有可能吗?我还尝试第二次调用将资产导出到另一个视图控制器,但结果是一样的。我如何在中断后重复保存而不丢失我的资产(它是由另一个视图控制器构建的,如果没有新的用户交互,我无法重建它)?
这是我的代码:
-(无效)保存{
[asset exportAsynchronouslyWithCompletionHandler:^
{
switch (asset.status)
{
case AVAssetExportSessionStatusCompleted:
{
[self performSelectorOnMainThread:@selector(lanciosuccess) withObject:nil waitUntilDone:NO];
break;
}
case AVAssetExportSessionStatusFailed:
{
[asset cancelExport];
[self performSelectorOnMainThread:@selector(sospendi) withObject:nil waitUntilDone:NO];
break;
}
case AVAssetExportSessionStatusUnknown:
{
NSLog (@"unknow");
break;
}
case AVAssetExportSessionStatusWaiting:
{
NSLog (@"waiting");
break;
}
case AVAssetExportSessionStatusCancelled:
{
NSLog (@"cancelled");
break;
}
};
}];
}
-(无效)sospendi{
if ([[NSFileManager defaultManager] fileExistsAtPath:[asset.outputURL path]])
{
[[NSFileManager defaultManager] removeItemAtPath:[asset.outputURL path] error:nil];
}
[self save];
}