Cocoa touch NSURLSession取消任务

Cocoa touch NSURLSession取消任务,cocoa-touch,ios7,nsurlsession,Cocoa Touch,Ios7,Nsurlsession,我使用以下配置创建新的NSURLSession if (!self.session) { NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:[self uniquieIdentifier]]; config.discretionary = NO; self.session = [NSUR

我使用以下配置创建新的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];

尽管如此,我还是在delegate方法DidFinishDownloadingTour中得到了响应,我非常确定在这一点之后不会创建新的会话或下载任务。如何停止所有任务的发生?

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


您是否检查了给定任务的状态?它应该是
nsurlsessiontaskstate cancelling

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

我使用此代码取消所有挂起的任务

- (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;
}
-(无效)取消下载文件
{
[self.session GetTaskWithCompletionHandler:^(NSArray*数据任务,NSArray*上传任务,NSArray*下载任务){
for(下载任务中的NSURLSessionTask*_任务)
{
[_任务取消];
id文件=[self-getFileDownloadInfoIndexWithTaskIdentifier:_task.taskIdentifier];
[file.downloadTask cancel];
//更改所有相关属性。
file.isDownloading=否;
file.taskIdentifier=-1;
file.downloadProgress=0.0;
}
}];
取消=是;
}

请使用TaskIdentifier方法为getFileDownloadInfoIndexWithTaskIdentifier添加代码,或者只生成UUID并将其存储在NSUserDefaults中。确实不需要重用相同的会话标识符。:-)