NSURLSessionUploadTask 在创建后直接取消[重复]
Posted
技术标签:
【中文标题】NSURLSessionUploadTask 在创建后直接取消[重复]【英文标题】:NSURLSessionUploadTask is cancelled straight after creation [duplicate] 【发布时间】:2019-12-19 16:19:58 【问题描述】:我使用AFNetworking
库将打包文件发送到服务器。每个单独的数据包都使用使用AFURLSessionManager#uploadTaskWithRequest:fromData:progress:completionHandler
创建的单独的NSURLSessionUploadTask
发送。数据包的数量在 1 到几百个之间有所不同。数据包按顺序发送,直到上一个成功后才会发送下一个。
它在大多数情况下都可以正常工作,但最近用户(大约 1%)开始报告发送数据包有时会冻结。这是我在他们的日志中发现的:
Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=NSErrorFailingURLStringKey=https://url.to.service/service?params=XYZ, NSErrorFailingURLKey=***, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalUploadTask <72F2E4D0-4505-4D9D-85A5-08E0DF152EE9>.<354>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <72F2E4D0-4505-4D9D-85A5-08E0DF152EE9>.<354>, NSLocalizedDescription=cancelled
应用重试多次,但重新创建新的NSURLSessionUploadTask
并重试,但始终失败并出现完全相同的错误。
下面是代码的样子(为了便于阅读,我已经简化了):
@implementation PacketDataManagementService : AFHTTPSessionManager
- (void)uploadPacketData:(NSData *)packetData
NSURLRequest *request = [self createRequest];
__block NSURLSessionDataTask *task = [self uploadTaskWithRequest:request fromData:packetData progress:nil completionHandler:^(NSURLResponse *__unused response, id responseObject, NSError *error)
if ( error )
//log error
else
//notification to invoke `uploadPacketData` for the next packet
];
//adding this line was the only way to "reproduce" the issue my users have - exactly the same error is being logged
//[task cancel];
[task resume];
@end
我试图重现它但没有成功 - 这是我迄今为止所尝试的:
用户在不同的设备和 ios 版本上报告了它 - 我在这里没有找到任何共同点AFHTTPSessionManager
(PacketDataManagementService
扩展它)在请求之间保留并存储在用于发出所有这些请求的单例中。
请求未到达服务器 - 我检查了我们服务器的访问日志,并且来自已取消请求的请求丢失。
我创建了内存泄漏,以查看应用程序在接近 OOM 情况下的行为 - 上传行为正常,直到应用程序被操作系统杀死。
在过去的几天里,我的脑袋撞到了墙上,我不知道还能去哪里看 - 我会很感激任何建议。
【问题讨论】:
实际上,我发现将nil
作为数据日志传递也会取消错误(原文如此!) - 这是我将首先探讨的内容。
这能回答你的问题吗? URLSessionUploadTask getting automatically cancelled instantly
是的,当我发现nil
的值为data
记录task cancelled
错误时,我就找到了它。
【参考方案1】:
我找到了导致问题的原因 - AFURLSessionManager#uploadTaskWithRequest:fromData:progress:completionHandler
中的 fromData:
参数不能为 nil - 当 data
丢失时,任务会立即取消。当我尝试发送的文件之前被删除时,该问题暴露了应用程序另一部分的错误。
显然,一旦我发现问题出在a similar issue reported on ***,我就找到了解决方案。
Apple 没有在 API 文档中提到这种行为真是太疯狂了。
【讨论】:
以上是关于NSURLSessionUploadTask 在创建后直接取消[重复]的主要内容,如果未能解决你的问题,请参考以下文章
NSURLSessionUploadTask 不上传带参数的图片
NSURLSessionUploadTask 在创建后直接取消[重复]
当应用程序挂起时,我如何知道 NSURLSessionUploadTask 是不是正在工作?
iOS开发之网络编程--5NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传