2010-02-22 26 views
9

Trong một trong các ứng dụng của tôi, tôi sử dụng lại một lần xem web. Mỗi lần người dùng nhập vào một điểm nào đó trên dữ liệu tải lại cache cho webview sử dụng phương pháp này: -UIWebView được sử dụng hiển thị nội dung đã tải trước đó trong một giây ngắn trên iPhone

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL

và tôi chờ đợi cuộc gọi callback

- (void) webViewDidFinishLoad:(UIWebView *)webView.

Đồng thời, tôi ẩn chế độ xem web và hiển thị nhãn 'đang tải'. Chỉ khi tôi nhận được webViewDidFinishLoad để tôi hiển thị chế độ xem web.

Nhiều lần những gì xảy ra tôi thấy các dữ liệu trước đó đã được nạp vào webview trong một giây ngắn ngủi trước khi dữ liệu mới, tôi nạp đá trong.

tôi đã thêm một sự chậm trễ 0,2 giây trước khi hiển thị các webview nhưng nó không giúp được gì.

Thay vì giải quyết điều này bằng cách thêm nhiều thời gian hơn để sự chậm trễ không ai biết làm thế nào để giải quyết vấn đề này hoặc có thể dữ liệu cũ rõ ràng từ một webview mà không phát hành và phân bổ nó mỗi thời gian?

Trả lời

11

Cảm ơn malaki1974, trong trường hợp của tôi, tôi đã không sử dụng một cái nhìn phương thức. Khi tôi ngồi với một kỹ sư của Apple trên WWDC 2010 và hỏi ông câu hỏi này câu trả lời của ông chỉ đơn giản là: "Đừng tái sử dụng UIWebViews, đó không phải là cách họ được sử dụng để được sử dụng." Kể từ đó tôi đảm bảo cho các cuộc gọi này tập hợp các dòng trước khi phân bổ một UIWebView mới

[self.myWebView removeFromSuperview]; 
self.myWebView.delegate = nil; 
[self.myWebView stopLoading]; 
[self.myWebView release]; 

Đó giải quyết vấn đề này.

+2

Thật sao? Đó là một điều thực sự câm của Apple để xem xét Webview là tốn kém để tạo ra – hfossli

+0

Đó là lý do tại sao tôi muốn sử dụng lại chúng ngay từ đầu. Nhưng các kỹ sư của Apple nhấn mạnh rằng họ không có nghĩa là để được tái sử dụng (ít nhất là vào thời điểm đó trong cuộc sống khi iOS4 vừa được giới thiệu). Tôi phải thừa nhận rằng kể từ khi tôi thực hiện lời khuyên của ông, tôi đã không gặp phải vấn đề nữa. – Roi

+0

Vâng .. Tôi không thể sống mà không tái sử dụng xem xét nó đắt tiền đến mức nào. Nó hoạt động tốt cho tôi bằng cách sử dụng @ "about: blank" -trick ... – hfossli

1

Đầu tiên, UIWebView hiển thị nội dung trong chuỗi nền. Ngay cả khi bạn nhận được webViewDidFinishLoad: nó có thể chưa hoàn tất. Đặc biệt nếu nó là một trang mạnh mẽ đến từ mạng.

Bạn nói rằng bạn đang ẩn chế độ xem. Tôi tự hỏi nếu điều đó có nghĩa là webview trì hoãn bản vẽ của nó hoàn toàn. Những gì bạn có thể thử là di chuyển màn hình tắt UIWebView hoặc che khuất màn hình bằng một chế độ xem khác. Có lẽ điều đó sẽ thay đổi hành vi vẽ của nó.

Nếu bạn không cần tương tác UIWebView thì bạn cũng có thể cân nhắc thực hiện hoàn toàn màn hình ngoài ở UIWindow riêng biệt và sau đó tạo một hình ảnh từ lớp đó UIWebView.

+0

"nó có thể không được thực hiện hoàn toàn" - Có cách nào để biết khi nào nó hoàn thành? – Segev

0

Hãy thử tải một tập tin địa phương mà trống hoặc có một hình ảnh tải khi bạn giấu nó, thay vì chỉ tải nội dung mới khi bạn hiển thị nó. Vì tệp là cục bộ, nó sẽ nhanh chóng và ngay cả khi trang mới mất một thời gian để tải nó sẽ trống hoặc tải hành vi dự kiến.

+0

Thật không may, điều này không hữu ích. Ngay cả khi tảiHTMLString: @ "" có đủ thời gian trễ gây phiền toái. –

7

rõ ràng các nội dung của webview trước khi bạn cố gắng để tải nội dung mới

[self loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
+0

Bạn có thể giải thích thêm một chút về vấn đề này không? Điều này cho thấy chế độ xem web trống ... nhưng làm cách nào để kết nối với sự cố trì hoãn nội dung? – nodepond

+0

Ah, tôi hiểu rồi. Nó không phải về sự chậm trễ, nhưng về việc xóa nội dung trước khi hiển thị nội dung mới! – nodepond

+0

Đúng. Đó là ý tưởng. Tôi cũng đang đăng một giải pháp thay thế khác. – hfossli

0

Nếu bạn có controll trong html. Bạn có thể liên lạc lại với mục tiêu-c khi tài liệu đã sẵn sàng. Giống như trong jQuery:

function messageNative (name, string) { 

    var iframe = document.createElement("IFRAME"); 

    iframe.setAttribute("src", "appscheme://" + name + "/" + string); 
    document.documentElement.appendChild(iframe); 
    iframe.parentNode.removeChild(iframe); 
    iframe = null; 
} 

$(function() { 
    messageNative('webview', 'ready'); 
}); 

Và sau đó trong phương pháp đại biểu WebView UIWebView của: shouldStartLoadWithRequest: navigationType: chờ theo yêu cầu với url bằng "appscheme: // webview/sẵn sàng". Sau đó, bạn nên biết: tài liệu được tải và sẵn sàng để hiển thị. Sau đó, tất cả những gì là mất tích là một fade-in đơn giản hoặc một cái gì đó như thế :)

1

Đó là những gì tôi làm, và nó hoạt động:

[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"]; 
Các vấn đề liên quan