NSURLSession,上传任务 - 获取传输的实际字节

Posted

技术标签:

【中文标题】NSURLSession,上传任务 - 获取传输的实际字节【英文标题】:NSURLSession, upload task - Get actual bytes transferred 【发布时间】:2015-05-29 06:40:48 【问题描述】:

我收到错误报告,说我的 ios 应用程序在慢速连接时无法上传图片。虽然我的超时时间可能不够高,但还有另一个问题。

我发现上传进度很快就达到了 100%,尽管我可以在 Charles 中看到仍在传输字节。我使用下面的 NSURLSession 方法:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                     fromData:(NSData *)bodyData
                            completionHandler:(void (^)(NSData *data,
                                                        NSURLResponse *response,
                                                        NSError *error))completionHandler

并实现以下委托方法来接收进度事件:

- (void)URLSession:(NSURLSession *)session
              task:(NSURLSessionTask *)task
   didSendBodyData:(int64_t)bytesSent
    totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend

其实我用的是AFNetworking 2.5.2,就是用这个方法的。我的理论是这个委托方法报告从手机发送的字节而不是实际传输的字节。

以非常低的连接发送 300kb 将立即发送 5-6 个包,并在等待接收时报告 100% 的进度。

是否可以获得关于已确认传输的实际字节数的进度事件?

【问题讨论】:

【参考方案1】:

是的,这是可能的!

[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) 
     float prog = (totalBytesWritten / (totalBytesExpectedToWrite * 1.0f) * 100);
     [self.progBar setProgress:prog];
     NSLog(@"%f%% Uploaded", (totalBytesWritten / (totalBytesExpectedToWrite * 1.0f) * 100));

     ];

【讨论】:

我假设operationAFHTTPRequestOperation。恐怕这与使用会话的上述方法具有相同的“缺陷”。 如果您以正确的方式进行上传操作,那么它应该不会产生任何问题。我已经使用相同的操作上传了 30 张图片,还跟踪了答案中提到的进度。确保您使用的是“multipart”。 您是否尝试过使用像 Charles 这样的代理应用程序来限制上传速度,例如30kpbs?这是进度开始出现异常的时候,如上述问题中所述

以上是关于NSURLSession,上传任务 - 获取传输的实际字节的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 上传任务超时

使用 NSURLSession UploadTask 暂停、恢复、取消上传任务

如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?

有没有办法检索现有的 NSUrlSession/取消其任务?

NSURLSession 后台传输不起作用

使用 NSURLSession 如何在取消下载任务时获取接收到的数据或临时文件位置