我使用GCD在UIWebView中运行javascript,当它是正常的javascipt时,一切似乎都找不到,但是当涉及到“警告”时,弹出模式视图会使我的用户界面变得无法响应。
这是我在UIWebViewDelegate方法中的代码。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"RECEIVED");
BOOL re =[WebParserStrategy shouldConsiderAsRequest:request];
NSLog(@"--receive Request: %@ jumpTo:%@", request.URL.absoluteString, re == YES ? @"YES" : @"NO!!");
if(re == NO)
{
dispatch_async(parserRequestToMessageQueue, ^{
NSString *msg;
NSDictionary *param;
[WebParserStrategy transferRequest:request toMessage:&msg withParam:¶m];
WebObserverChain *chain = [self.messageObservers objectForKey:msg];
if(chain == nil)
;//NSLog(@"!!!unknow message:%@ not found in message list", msg);
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.webView stringByEvaluatingJavaScriptFromString:@"alert('')"];
});
}
});
}
return re;}
答案 0 :(得分:1)
这是因为Web警报是同步/阻塞的,您在整个应用程序的主队列中执行此操作。只需使用UIAlertView或找到其他解决方案即可通过警报完成。
由于您无法控制UIWebView执行Objective-C提供的javascript中的并发性,因此您应该避免执行任何执行速度不是非常快速的调用。否则你的整个应用程序的主线程将受到最臭名昭着的UIKit类之一的摆布。