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 版本上报告了它 - 我在这里没有找到任何共同点 AFHTTPSessionManagerPacketDataManagementService 扩展它)在请求之间保留并存储在用于发出所有这些请求的单例中。 请求未到达服务器 - 我检查了我们服务器的访问日志,并且来自已取消请求的请求丢失。 我创建了内存泄漏,以查看应用程序在接近 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 在创建后直接取消[重复]

当应用程序挂起时,我如何知道 NSURLSessionUploadTask 是不是正在工作?

iOS开发之网络编程--5NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

我可以使用 NSURLSessionUploadTask 进行离线同步任务吗?