如果数据开始加载但不是 webViewDidFinishLoad,则不会触发 NSMutableURLRequest 超时

Posted

技术标签:

【中文标题】如果数据开始加载但不是 webViewDidFinishLoad,则不会触发 NSMutableURLRequest 超时【英文标题】:NSMutableURLRequest timeout doesn't trigger if data starts to load but not webViewDidFinishLoad 【发布时间】:2009-12-10 20:44:09 【问题描述】:

我正在加载一个 UIWebview 并请求一个可能需要一些时间才能完成加载的 URL。请求开始并开始接收数据。但是,请求似乎没有完成。 webViewDidFinishLoad 永远不会触发,webView didFailLoadWithError: 回调也不会触发。

NSURLRequest 的超时是否仅在没有响应接收数据的情况下发生,或者如果请求在该时间间隔内也没有完成,它是否也会触发?

如果是前者,是否有一个优雅的解决方案来超时请求?

相关代码为:

加载请求:

- (void) loadRequest NSString *targetURL = @"@987654321@"; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: targetURL] cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 15.0] autorelease];

[request setHTTPBasicID: [[self credentialManager] userID] password:[[self credentialManager] password]];
[webView loadRequest:request];

委托响应超时

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: NO]; [alert hide]; [alert autorelease]; alert = nil; NSLog(@"error - %@", error); [self showRetryPrompt: error];

【问题讨论】:

【参考方案1】:

NSURLRequest 的超时用于连接。如果您已连接并且服务器需要很长时间才能响应,那么超时对您没有好处。您需要为您想要的超时设置自己的 NSTimer 并自行取消请求。

【讨论】:

【参考方案2】:

同意user158743。

使用 NSTimer,将计时器设置为在 webViewDidStartLoad 委托方法处启动,然后确保在 webViewDidFinishLoad 和 webViewDidStarLoad 方法中有计数器来检查 webView 是否已加载(这是一个丑陋的 hack,但除非你使用javascript 来检查页面中元素的数量,真的无法知道这两种方法会被调用多少次)。

这样做后,在计时器到达其时间后检查您正在运行的方法的计数器,这应该可以工作。

NSTimer 代码在这里 --> http://www.iphonedevsdk.com/forum/iphone-sdk-development/14403-nstimer-examples.html

希望这会有所帮助,它对我有用。虽然我知道存在缺陷,但它对我有用,因为我正在加载一个初始屏幕应该是轻量级的。不过,我仍在寻找解决方案,如果我有其他选择,我会在此处发布编辑。

非常欢迎反馈!

【讨论】:

以上是关于如果数据开始加载但不是 webViewDidFinishLoad,则不会触发 NSMutableURLRequest 超时的主要内容,如果未能解决你的问题,请参考以下文章

如何加载数据库Fbx文件,不是assetbundle

使用 BLoC 在 init 上加载数据

类加载Class Loading

关于ajax实现div的Lazyload

如果我稍后使用 SKTextureAtlas,Sprite Kit 是不是会多次加载纹理图集?

具有远程存储但在本地查询的组合框