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)