こんにちは、AVAssetExportSession オブジェクトを作成してビデオ ファイルを保存および作成する iPhone アプリケーションを開発しています。保存プロセスを再開しようとする場合を除いて、すべて問題ありません (ファイルが作成され、ドキュメント フォルダーに正しく保存されます)。ホームボタンを押してアプリを終了すると (または電話や SMS を受信した場合)、メソッド exportAsynchronouslyWithCompletionHandler が失敗します。Apple のドキュメントには次のように書かれています。
「既存のファイルを上書きしようとしたり、アプリケーションのサンドボックス外にファイルを書き込もうとすると、エクスポートは失敗します。既存のファイルを上書きする必要がある場合は、最初にそれを削除する必要があります。エクスポートは次の場合にも失敗する可能性があります。
着信あり
アプリケーションがバックグラウンドにあり、別のアプリケーションが再生を開始します
このような状況では、通常、エクスポートが失敗したことをユーザーに通知してから、ユーザーがエクスポートを再開できるようにする必要があります。」
そのため、エクスポートをキャンセルしてから、ユーザーがアプリを再度開いたときに再起動しようとします。exportAsynchronouslyWithCompletionHandler が 2 回目に呼び出されると、次のエラーが発生します。
「キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'exportAsynchronouslyWithCompletionHandler を呼び出せません: 複数回。'"
[asset CancelExport] exportAsynchronouslyWithCompletionHandler が生きたままになっているようですが、可能でしょうか? また、2 回目の呼び出しでアセットを別のビュー コントローラーにエクスポートしようとしましたが、結果は同じです。アセットを失うことなく、中断後に保存を繰り返すにはどうすればよいですか (それは別のビュー コントローラーによってビルドされており、新しいユーザーの操作なしでは再構築できません)。
これは私のコードです:
-(無効)保存{
[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;
}
};
}];
}
-(void)sospendi{
if ([[NSFileManager defaultManager] fileExistsAtPath:[asset.outputURL path]])
{
[[NSFileManager defaultManager] removeItemAtPath:[asset.outputURL path] error:nil];
}
[self save];
}