2013-11-14 3 views
4

создать новую NSURLSession со следующей конфигойNSURLSession отменить задачу

if (!self.session) { 
      NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:[self uniquieIdentifier]]; 
      config.discretionary = NO; 
      self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 
     } 

и после нажатия кнопки я пытаюсь остановить все текущие задачи загрузки.

[[[self session] delegateQueue] setSuspended:YES]; 
[[self session] invalidateAndCancel]; 

Тем не менее я получаю ответы в методе делегата didFinishDownloadingToURL, и я уверен, что никаких новых сессий или загрузить задание не созданы после этого момента. Как остановить любую задачу?

ответ

2

Это ожидаемое поведение, когда вы отменяете задачи на сеансе, они все равно могут вызвать метод делегата.

Вы проверяете состояние данной задачи? Он должен быть NSURLSessionTaskStateCanceling.

+0

Пожалуйста, добавьте код для метода getFileDownloadInfoIndexWithTaskIdentifier –

14

Я не рекомендую использовать метод invalidateAndCancel, потому что очередь и ее идентификатор остаются недействительными и не могут быть повторно использованы до тех пор, пока вы не сбросите все устройство.

NSURLSession class reference

Я использую этот код, чтобы отменить все отложенные задания.

- (void) cancelDownloadFiles 
{ 

    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { 

     for (NSURLSessionTask *_task in downloadTasks) 
     { 
      [_task cancel]; 

      id<FFDownloadFileProtocol> file = [self getFileDownloadInfoIndexWithTaskIdentifier:_task.taskIdentifier]; 

      [file.downloadTask cancel]; 

      // Change all related properties. 
      file.isDownloading = NO; 
      file.taskIdentifier = -1; 
      file.downloadProgress = 0.0; 

     } 

    }]; 

    cancel = YES; 
} 
+0

Или просто генерировать UUID и хранить его в NSUserDefaults. Нет необходимости повторно использовать один и тот же идентификатор сеанса. :-) – dgatwood

Смежные вопросы