ОШИБКА: exportAsynchronouslyWithCompletionHandler более одного раза.Возобновить вывоз за границу - PullRequest
3 голосов
/ 05 августа 2011

Привет, я разрабатываю приложение для iphone, которое создает объект AVAssetExportSession для сохранения и создания видеофайла. Все в порядке (файл создан и правильно сохранен в папке с документами), за исключением случаев, когда я пытаюсь возобновить процесс сохранения. Если я нажимаю кнопку «Домой», чтобы выйти из приложения (или если я получаю вызов или смс), метод exportAsynchronouslyWithCompletionHandler завершается ошибкой. Документация Apple гласит:

"Экспорт завершится неудачно, если вы попытаетесь перезаписать существующий файл или записать файл за пределами изолированной программной среды приложения. Если вам нужно перезаписать существующий файл, вы должны сначала удалить его. Экспорт также может произойти сбой, если:

Есть входящий телефонный звонок

Ваше приложение работает в фоновом режиме, и другое приложение начинает воспроизведение

В этих ситуациях обычно следует сообщить пользователю о сбое экспорта, а затем разрешить пользователю перезапустить экспорт. "

Поэтому я пытаюсь отменить экспорт, а затем перезапустить его, когда пользователь снова откроет приложение. У меня есть эта ошибка, когда exportAsynchronouslyWithCompletionHandler вызывается во второй раз:

"Завершение приложения из-за необработанного исключения« NSInternalInconsistencyException », причина:« Невозможно вызвать exportAsynchronouslyWithCompletionHandler: более одного раза. »«

Кажется, что после [актив 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];

}

...