【问题标题】:How do iOS HTTP request retries work?iOS HTTP 请求重试如何工作?
【发布时间】:2014-05-28 23:11:43
【问题描述】:

我正在使用 NSURLConnection 发送一个 HTTP 请求并运行它

[[NSURLConnection alloc] initWithRequest:self.request delegate:self];

其中“self.request”是一个配置的 NSMutableURLRequest 对象。网络故障并回调到

-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error

我想取消请求并将有效负载写入文件以便稍后上传。但是,如果我重新连接太快,有效负载最终仍然会被发送(我稍后会从文件中发送相同的有效负载)。在失败回调中,我尝试使用

[connection cancel];

但在几秒钟内重新连接后,http 请求仍会通过。这是因为我可以禁用某些重试机制吗?

【问题讨论】:

    标签: ios objective-c networking nsurlconnection


    【解决方案1】:

    来自 Apple 在 didFailWithError: 上的文档

    // Once the delegate receives this message, it will receive no further messages for connection.
    

    所以我会说你在代码的其他地方有一个错误。一旦调用了该委托消息,连接就完成了,除非您这样做,否则它将永远不会重新启动。

    从问题看来,您似乎正试图取消失败委托方法中的连接,对吗?这不应该是必要的,因为连接已经死了。当您说“快速重试”时,我也有些困惑。我没有看到任何“重试”代码,所以如果你也可以发布它会有所帮助。

    您能否发布更多代码来帮助诊断问题?

    【讨论】:

    • 如果我切断连接并发送消息并在短时间内(几秒钟)重新建立连接,消息仍然会发送(我不想要的行为)。如果我等待超过 5-10 秒,消息将失败,这让我认为有一些底层机制在短时间内重试请求。
    • 我想我们也看到了这个问题。我们的 NSURLProtocol 子类尝试在 HTTP 基本身份验证失败时取消连接。但是有些东西又重试了 5 次请求。也许苹果开发者论坛是一个更好的地方来问这个问题。 Apple 工程师可能会告诉我们是否有某种内部重试机制。
    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2020-11-26
    • 1970-01-01
    • 2014-08-25
    • 2018-03-30
    相关资源
    最近更新 更多