3

您好我正在开发一个 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];

}

4

0 回答 0