4

我使用以下配置创建新的 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 中得到了响应,并且我很确定在此之后不会创建新的会话或下载任务。如何阻止所有任务的发生?

4

2 回答 2

16

我不建议使用 invalidateAndCancel 方法,因为队列及其标识符保持无效并且在您重置整个设备之前无法重复使用。

NSURLSession 类参考

我使用此代码取消所有待处理的任务。

- (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;
}
于 2014-11-24T15:30:46.433 回答
2

这是预期的行为,当您取消会话上的任务时,它们可能仍会调用委托方法。

你检查给定任务的状态了吗?应该是NSURLSessionTaskStateCanceling

于 2014-01-31T01:53:37.393 回答