2009-09-16 31 views
7

Tất cả UIWebViews chia sẻ một chuỗi web đơn lẻ.Tránh chủ đề chính bị đóng băng khi UIWebView cố khóa chặn chủ đề web

Khi một trong số đó là init -ed, bị xóa khỏi superview, v.v., chúng sẽ cố gắng khóa chuỗi web khỏi sợi chính theo kiểu bị chặn, do đó tạm thời làm lạnh vòng lặp chạy của chuỗi chính.

Nếu chuỗi web bận, ví dụ: trong khi thực hiện đồng bộ dài XMLHttpRequest, điều này có thể chặn luồng chính trong một thời gian dài.

Có cách nào để tránh điều này không?

Nếu tôi có thể sửa đổi UIWebView, tôi chỉ cần thực hiện khóa không chặn, nhưng rõ ràng đó không phải là trường hợp, vì vậy tôi đang tìm kiếm các ý tưởng thông minh khác.

Trả lời

6

Các dài và ngắn của nó là: tránh làm bất cứ điều gì mà khối thread trên web cho một số lượng đáng kể thời gian (window.alert, window.prompt, XMLHttpRequest.open('GET', url, false), có thể những người khác)

Ngoài ra, tránh gọi phương pháp mà khóa thread web và sau đó ngay lập tức làm một cái gì đó mà phải mất một thời gian dài như là chủ đề web chỉ được mở khóa khi kiểm soát được trả lại cho vòng lặp chạy. (Ví dụ: gọi -[UITextView setText:] rồi đọc tệp đồng bộ trên chủ đề chính)

+0

Vậy điều gì sẽ xảy ra trong MobileSafari nếu một trang thực hiện XHR đồng bộ chậm? Tôi đã không thử nghiệm nó, nhưng nó chỉ đóng băng hoặc những gì? –

+0

Nó sẽ khóa khóa của chuỗi web trong suốt thời gian yêu cầu. Nếu chủ đề chính sau đó cố gắng lấy khóa, nó sẽ phải chờ yêu cầu hoàn thành (hoặc hết giờ) – rpetrich

+1

Ngoài ra, tôi nên đề cập rằng nếu bạn sử dụng XHR không đồng bộ, điều này sẽ không còn là vấn đề nữa (tức là xhr. Mở ('GET', url, true)) – rpetrich

0

bạn không thể tạo xhr đồng bộ vì điều này sẽ dẫn đến lỗi chính sách crossdomain.

Các vấn đề liên quan