NSURLSession 中的 TaskIdentifier 没有改变

Posted

技术标签:

【中文标题】NSURLSession 中的 TaskIdentifier 没有改变【英文标题】:TaskIdentifier in NSURLSession not Changing 【发布时间】:2016-02-23 07:00:04 【问题描述】:

我正在尝试通过我的应用程序中的 NSURLSession 上传多个视频。但是每个请求的 taskIdentifier 都是一样的。它不会对每个请求都进行更改。我们如何跟踪我们的请求?我们怎么知道哪一个完成了?

这是我的代码:

   _uploadTask = [_session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 

    id jsonResponse= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

   ];

 [_uploadTask resume];
 NSLog(@" task ID %ld",_uploadTask.taskIdentifier);

这里:_uploadTask 是 NSURLSessionUploadTask 的实例,_session 是 NSURLSession 的实例,request 是 NSMutableURLRequest 实例,body 是 NSData。 输出为:

"task ID 1"

【问题讨论】:

【参考方案1】:

我会做以下事情来跟踪

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://someurl.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *someTask= [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) 
        if (error) 
            NSLog(@"error!");
         else 
            NSLog(@"task successful!");
        
    ];
    [someTask resume];

【讨论】:

好的,你的问题是已知的,它是异步工​​作的,这就是为什么它被分配了相同的任务标识符。虽然有可用的调整解决方案。【参考方案2】:

首先,添加一个属性,以便您可以存储由 NSURLSession 创建的标识符。这个 id 是自动创建的,所以不知道它是 1,2,3 还是什么。所以你需要在任务创建期间存储它。

_uploadTask = [_session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 

    // do your thing

   ];
 _myTaskID = [_uploadTask taskIdentifier];
 [_uploadTask resume];

然后调用这个方法取消那个任务

- (void)cancelTaskByIdentifer:(long)myTaskID 

    [[NSURLSession sharedSession] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) 

        if (!dataTasks || !dataTasks.count) 
            return;
        
        for (NSURLSessionTask *task in dataTasks) 
            long taskId = [task taskIdentifier];
            if (taskId==myTaskID) [task cancel];
        
    ];

例如:

[self cancelTaskByIdentifier:_myTaskID];

【讨论】:

以上是关于NSURLSession 中的 TaskIdentifier 没有改变的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 后台会话中的 NSURLSessionDownloadTask 给出错误

我可以在创建 NSURLSession 后更新其配置中的 cookie 吗?

ios 9.2 中的 NSURLSession/NSURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9802)

获取所有视图控制器中的 NSURLSession 下载进度

学习NSURLSession

nsurlsession 用于循环中的多个请求