iOS-webview,dispatch_async主线程调用a

2019-07-11  本文已影响0人  水水兔

原文地址:https://www.jianshu.com/p/83b5522b4607

看完RiverLi君的解释,在这里我添加一点自己的理解,感觉会更通俗一点。

如图:

CAFF2056-7E4E-454C-B98F-9F0B3AFFC4EF.png

主线程的队列是串行队列,当执行代码

 dispatch_async(dispatch_get_main_queue(), ^{ [self.webpageView     
          stringByEvaluatingJavaScriptFromString:@"alert(1)"];});

等同于在队列中加入任务一,当点击alert按钮时,因为是UI操作,所以会往队列中添加任务二,由于是串行执行,所以任务二要等任务一执行结束,才能执行,而alert后面的的代码,要等任务二执行了才会执行,即任务一想要结束,必须等任务二结束,如此形成了一个等待环,线程卡死。

而执行

[self.webpageView performSelectorOnMainThread:@selector(stringByEvaluatingJavaScriptFromString:)
                                   withObject:@"alert(1)"
                                waitUntilDone:NO]

因为有个超时时间,等达到一个超时时间后,任务一主动结束,任务二就会被执行,所以整队列任务能正常串行执行

上一篇下一篇

猜你喜欢

热点阅读