Tôi đã tìm thấy sự cố có vẻ như gây ra bế tắc trong WebKit. Nếu tôi chạy mã này từ chủ đề chính của mình, tôi sẽ thấy một cảnh báo. Tôi có thể gõ vào nút "OK" trên báo và nó bác bỏ và tất cả đang làm việc tốt:Bế tắc với GCD và webView
[theWebView stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
Nếu tôi làm cho một sửa đổi nhỏ, sau đó các thông điệp cảnh báo vẫn xuất hiện, nhưng nút OK không thể được khai thác trên - bạn không thể bỏ qua những cảnh báo và nếu bạn đột nhập vào ứng dụng nó được treo ở stringByEvaluatingJavaScriptFromString
gọi:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
[theWebView stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
});
});
các chỉ khác nhau trong hai là trong một giây, nó đang chạy JS trong chủ đề chính trong ngữ cảnh của một hàng đợi công văn.
Mặt khác, nếu tôi làm như sau, sau đó được hang không xảy ra:
- (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];
});
Ai đó có thể tỏa sáng một số ánh sáng về những gì đang xảy ra sai gây ra treo?
EDIT:
câu hỏi liên quan:
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
câu hỏi Rất tương tự:
UIWebView stringByEvaluatingJavaScriptFromString hangs on iOS5.0/5.1 when called using GCD
Bạn có thể giải thích thêm về các chế độ vòng lặp chạy hay không và cách thực thi 'dispatch_async' sẽ khiến mã chạy trong chuỗi chính? Ngoài ra, làm thế nào bạn có thể thay đổi chế độ gửi luồng? –
@itechnician - tôi đang đối mặt với cùng một vấn đề.Error là void SendDelegateMessage (NSInvocation *): delegate (webView: identifierForInitialRequest: fromDataSource :) không quay trở lại sau khi chờ 10 giây. chế độ vòng lặp chạy chính: kCFRunLoopDefaultMode và nó đang chặn giao diện người dùng. WebView đang đóng băng. Vì vậy, bạn có bất kỳ ý tưởng nào là cách tốt nhất để giải quyết vấn đề này. – Sandeep