我發現了一個似乎導致WebKit出現死鎖的問題。如果我從主線程運行此代碼,我會正確地看到警報。我可以點擊進入戒備狀態「確定」按鈕,解聘和一切工作正常:GCD和webView造成的死鎖
[theWebView stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
如果我做一個小的修改,則仍出現警告消息,但OK按鈕無法拍了拍 - 你不能解除警報,如果你闖入它是掛在stringByEvaluatingJavaScriptFromString
調用相應的應用:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
[theWebView stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
});
});
的只在這兩個不同的是,在第二個,它正在運行的JS在主線程在調度隊列的上下文中。
在另一方面,如果我這樣做,然後掛起不會發生:
- (void) showHi:(id) it
{
[(UIWebView*)it stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
}
....
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelectorOnMainThread:@selector(showHi:) withObject:theWebView waitUntilDone:NO];
});
有人可以照到什麼錯誤造成掛一些輕?
編輯:
相關問題:
Perform UI Changes on main thread using dispatch_async or performSelectorOnMainThread?
Whats the difference between performSelectorOnMainThread and dispatch_async on main queue?
Grand Central Dispatch (GCD) vs. performSelector - need a better explanation
非常類似的問題:
UIWebView stringByEvaluatingJavaScriptFromString hangs on iOS5.0/5.1 when called using GCD
你能解釋一下關於運行循環模式的更多信息,以及'dispatch_async'如何執行將導致代碼在主線程中運行?另外,你如何改變線程的調度模式? –
@技術人員 - 我面臨同樣的問題。錯誤是無效SendDelegateMessage(NSInvocation *):委託(webView:identifierForInitialRequest:fromDataSource :)等待10秒後未能返回。主要運行循環模式:kCFRunLoopDefaultMode並阻止UI。 WebView凍結。所以你有什麼想法解決這個問題的最好方法是什麼。 – Sandeep