iOS NSURLConnection:如何知道所有字节都已发送?

Posted

技术标签:

【中文标题】iOS NSURLConnection:如何知道所有字节都已发送?【英文标题】:iOS NSURLConnection: How to know that all bytes have been sent? 【发布时间】:2017-05-15 15:06:36 【问题描述】:

我对收到的任何字节都不感兴趣。我只想知道是否所有字节都已发送(奖励:加上服务器通过 TCP-ACK 确认)。这在不良网络和网络切换情况下尤其有趣。

我更喜欢用 NSURLConnection / NSURLConnectionDelegate 来做,猜想这些类不提供,URLSession(Delegate) 也不提供。

不幸的是,到目前为止,我只看到了如何查看接收到的字节。

有谁知道如何找出发送的字节数?

【问题讨论】:

【参考方案1】:

NSURLConnection 已被弃用。您不应该将它用于新的开发,而应该将您现有的代码从中迁移出来。

URLSession 的各种委托方法将通知您会话任务的进度。

例如,URLSessionTaskDelegate 方法 urlSession(_:task:didCompleteWithError:) 会在您的任务完成时通知您。

URLSessionTaskDelegate 方法 urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) 将告诉您发送的字节数。

第二种方法似乎信息更丰富,更接近你想要的。

【讨论】:

嗨,邓肯。这可能是最好的答案,但不幸的是它仍然很不令人满意:1)它只报告正文数据,但 HTTP/S 增加了我需要确保它也发送的大量开销,2)它没有解决字节是否只是sent or also TCP-ACK'd, 3)三种可能的下载任务都有各自的缺点:这里上传当然是错误的类型,数据不在后台运行,下载听起来只能写到一个直接存档。

以上是关于iOS NSURLConnection:如何知道所有字节都已发送?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中使用 NSURLConnection 以串行顺序下载文件

我们如何在 iPhone Xcode 中处理多个 NSURLConnection?

NSURLConnection 以错误 iOS13 模拟器和 MACOS 10.14.6 完成

NSURLConnection 在 iOS 设备上重定向,但不在模拟器上

在同步调用上强制 NSUrlConnection 超时

如何在NSURLConnection中禁用keepalive?