stringByEvaluatingJavaScriptFromString:使我的用户界面无响应

时间:2012-08-03 19:03:20

标签: ios objective-c grand-central-dispatch

我使用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:&param];
            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;}

1 个答案:

答案 0 :(得分:1)

这是因为Web警报是同步/阻塞的,您在整个应用程序的主队列中执行此操作。只需使用UIAlertView或找到其他解决方案即可通过警报完成。

由于您无法控制UIWebView执行Objective-C提供的javascript中的并发性,因此您应该避免执行任何执行速度不是非常快速的调用。否则你的整个应用程序的主线程将受到最臭名昭着的UIKit类之一的摆布。