关于_WebTryThreadLock , tried to obtain the web lock from a thread other than the main thread or the web thread 的解决办法

利用web界面操作iDevice时,在处理Web请求的方法

-(void)calloutHandler {

    NSString *telNum = @"123456";

    AppDelegate *appdelegate = [[UIApplication sharedApplication] delegate];

    InitialViewControler *initialViewController = (InitialViewController *)appDelegate.window.rootViewController;

    initialViewController.telNum = telNum;

    [initialViewController callout];
}

InitialViewController中的处理方法

- (void)callout {

    NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", self.telNum];

    UIWebView *phoneCallWebView = [[UIWebView alloc] init];

    [phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]];

    [self.view addSubview:phoneCallWebView];
}

问题来了,使用UIWe不View处理打电话这个动作是为了电话结束的时候能够返回应用界面,同时又没有使用网上说的那个可能会上不了AppStore的方法(没试过)。关于代码打电话可以看这篇文章。如果使用这种方法,在UIWebView *phoneCallWebView = [[UIWebView alloc] init]这句就跑不动了,报tried to obtain the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary threadbalabala。大体意思就是操作UIKit必须在主线程上。所以我们使用GCD把UIWebView *phoneCallWebView = [[UIWebView alloc] init] 提到主线程上来,方法如下

- (void)callout {

    NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", self.telNum];

    dispatch_async(dispatch_get_main_queue(), ^{

        UIWebView *phoneCallWebView = [[UIWebView alloc] init];

        [phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]];

        [self.view addSubview:phoneCallWebView];
    }
}

就可以了。不想用或者用不了GCD的,可以参考这篇文章

    原文作者:时间背后
    原文地址: https://segmentfault.com/a/1190000000441781
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞