2013-11-14 100 views
4

我創造新的NSURLSession具有以下CONFIGSNSURLSession取消任務

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