如何为NSURLConnection请求设置实时超时?

问题描述:

请看下面的代码:如何为NSURLConnection请求设置实时超时?

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:<...> cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:3.0]; 
<...> 
[NSURLConnection sendSynchronousRequest:request returningResponse:&WSresponse error:&WSerror] 

此代码波纹管是由后台线程调用:

[self performSelectorInBackground:@selector(<...>) withObject:nil]; 

有时sendSynchronousRequest的效果要大于3.0秒。 (最多1分钟)。

  1. 如何设置实时超时而不是工作timeoutInterval:3.0
  2. 如何添加一个用户在任何时候停止冻结的能力NSURLConnection取消按钮的请求?

非常感谢您的帮助!

  1. 请注意,除了您调用的初始化程序之外,还可以在NSMutableURLRequest上调用-setTimoutInterval:。超时值确实有效,但是忽略小于240的任何值 - 这是iOS框架所要求的最小值。如果你想设置一个较低的超时值,那么你唯一的选择是使用异步请求。

  2. 如果您想异步取消请求(即,在后台执行请求并允许前台UI线程发出取消以响应用户点击取消或停止按钮),那么您必须一个异步URL请求。无法通过同步请求执行此操作。例如,当它正在执行一个块时,你甚至不能杀死一个调度队列。

你可能想看看ASIHTTPRequest,它包含了这个功能有些不同。

+0

提醒:ASIHTTPRequest未得到积极维护 –

超时时间间隔仅描述了连接在超时之前的任何时刻可以空闲的时间量。从Apple文档:

如果连接尝试的请求保持空闲时间超过超时 间隔较长时,该请求被认为已经超时。

因此,如果您的数据正在检索任何大量的数据,则需要更长的时间。

如果您希望在您“停止监听”之前有更多的控制权,那么您应该使用异步请求。异步请求也会使用户在等待时看不到冻结。

+0

感谢您的回答!但我想添加一个按钮取消以在任何时候停止请求。这个怎么做? – Dmitry

+1

你可以在你提出请求的NSURLConnection上调用取消方法(假设你保存了对它的引用)。这应该防止未来的回调被发送到您的代理。 –

+0

@Tim Deam - 只有在主线程上调用同步IO时,* no-freezing *注释才有效。在后台线程上,由于代码复杂性大大降低,所以同步IO可能是首选。 – PeyloW