看完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]
因为有个超时时间,等达到一个超时时间后,任务一主动结束,任务二就会被执行,所以整队列任务能正常串行执行
网友评论