使用NSURLConnection取消文件上传

时间:2014-03-19 03:41:07

标签: ios objective-c networking nsurlconnection

我的NSURLConnection超时= 30秒,这是在服务器上传图像。 如果连接太可怕并调用委托方法didFailWithError:,那么我需要取消当前连接。 但是,如果我只是呼叫[myConnection cancel]连接仍然有效,但不会调用委托方法(苹果文档说它 - NSURLConnection cancel方法)。我想中止连接但不仅删除委托方法。我怎么能做什么?

UPD: 我的问题是如果连接因超时而失败 - 在业务逻辑中我必须重新创建具有类似请求的连接。如果我有一个可怕的连接1分钟后,连接将是好的 - 服务器将获得很多(约3次重试计数)照片。但前2个连接被取消。 -

此刻我做了#34;脏黑客"喜欢"如果是照片上传请求" - 不要重试重新创建连接。

3 个答案:

答案 0 :(得分:1)

我做了很多网络工作,并且不记得一切都成功收到但iOS应用程序超时的情况。我正试图弄清楚你描述的场景,你会看到这种情况发生了很多,我不知道会发生什么。我们可能需要查看您的一些代码。

无论如何,cancel NSURLConnection时,它不仅会停止调用委托方法,还会停止上传。我刚做了一个测试:

  • 我尝试上传20mb文件(非chunked请求);

  • 在1mb标记处(由didSendBodyData标识),我取消了连接(通过调用[connection cancel]);

  • 我当时立即停止接收任何委托讯息;

  • 看着Charles,我只在请求的十六进制日志中看到了1.3mb的数据。当我查看Mac OS“活动监视器”的“网络”选项卡并查看“已发送字节”时,它已上传到2.1mb。

因此,取消连接将阻止发送更多数据。也许如果有一些正在进行的传输仍然存在(这是我们生活的异步世界),但结论是取消的连接将定期发送其完整的HTTP请求并不是真的。必须有一些与您的环境特有的超时性质有关。

就您当前的问题而言,我可能会建议在上传iOS应用程序为上传分配一些唯一标识符的文件时,以便服务器代码可以立即识别重复请求并适当地处理它们。但问题是为什么你会看到这么多的超时,特别是那些请求似乎成功收到的请求,但响应却没有。这很好奇。

答案 1 :(得分:0)

您无法强制中止正在进行的连接。 如果尚未开始连接取消, NSURLConnection unscheduleFromRunLoop 将起作用。

答案 2 :(得分:0)

尝试以下步骤

[myConnection cancel];
myConnection = nil;

可能对您的情况有所帮助,如果此步骤无效,请尝试使用myConnection.delegate = nil;