NSURLSession取消任务

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中收到响应,我非常确定此后没有创建任何新的会话或下载任务。如何停止所有任务?

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;
}

或者只需生成一个UUID并将其存储在NSUserDefaults中。真的没有必要重复使用相同的会话标识符。 :-) - dgatwood

3

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

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


请添加getFileDownloadInfoIndexWithTaskIdentifier方法的代码。 - ZaEeM ZaFaR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接