2010-10-04 4 views
5

Tôi hiển thị một lượng nhỏ nội dung cục bộ trong UIWebView, khoảng 3 đoạn văn bản và một hình ảnh 100x100px. Khi UIWebView được đẩy lên bộ điều khiển nav, nó mất khoảng nửa giây trước khi nội dung được hiển thị. Điều này xảy ra trên thiết bị, không phải trong trình mô phỏng. Rõ ràng UIWebView cần thực hiện một số công việc trước khi hiển thị nội dung, nhưng có cách nào tôi có thể thực hiện điều này trước khi chế độ xem được đẩy xuất hiện không? Tôi đã không có bất kỳ may mắn làm điều này bản thân mình.Độ trễ UIWebView khi tải nội dung cục bộ

Đây là nơi tôi là tạo ra và đẩy bộ điều khiển xem có chứa UIWebView:

ArticleViewController* viewController = [[ArticleViewController alloc] init]; 
viewController.article = article; 
[viewController view]; //touch the view so it gets loaded 
[viewController loadWebView]; //load the web view content 
[self.navigationController pushViewController:viewController animated:YES]; 
[viewController release]; 

Và đây là loadWebView phương pháp:

-(void)loadWebView { 
    NSString *path = [[NSBundle mainBundle] bundlePath]; 
    NSURL *baseURL = [NSURL fileURLWithPath:path]; 

    NSString* content = article.content; 

    NSString *html = [NSString stringWithFormat:@"\ 
         <html><body style='background-color: transparent'><style type=""text/css"">body {font-family: helvetica; color: black; font-size: 10pt; margin: 10px 10px 10px 10px}</style>\ 
         %@<div style='text-align:center'><a href='13443574_9709e4cf37.jpg?photographer=test' style='-webkit-tap-highlight-color:rgba(0,0,0,0);'><img src='13443574_9709e4cf37.jpg' height='160' width='230'></a></div></body></html>", content]; 
    [self.webView loadHTMLString:html baseURL:baseURL]; 
} 

Trước đây tôi đã [viewController loadWebView] trong phương pháp viewDidLoad , nhưng kết quả có vẻ giống nhau. Một màn hình trống khi viewController được đẩy, theo sau là nội dung tải nửa giây sau đó.

Bất kỳ ý tưởng nào?

Trả lời

1

Bạn sẽ đợi người dùng chờ đợi, câu hỏi duy nhất là: trước hoặc sau khi webview xuất hiện? Nếu bạn đã đặt "trước", thì bạn nên tạo bộ điều khiển, tải chế độ xem web, nhưng đợi để đẩy nó cho đến khi phương thức ủy nhiệm -webViewDidFinishLoad: ủy nhiệm. Khi bạn nhận được điều đó, bạn có thể đẩy chế độ xem.

7

Vấn đề xác nhận

tôi cũng thấy một nửa giây hoặc chậm trễ hơn với một màn hình trắng trước khi nội dung UIWebView của tôi xuất hiện. Điều này chỉ xảy ra khi sử dụng UIWebView đầu tiên trong lần chạy ứng dụng đó. Xuất hiện tiếp theo của UIWebView gần như tức thời. Vì vậy, có vẻ như với tôi và dân gian khác rằng sự chậm trễ phải do WebKit thư viện cần tải và khởi chạy.

Web khởi độngKhu

Bạn không thể loại bỏ độ trễ. Nhưng bạn có thể di chuyển sự chậm trễ đó vào đầu ứng dụng của mình, để giảm bớt tác động gây phiền nhiễu của "màn hình trống" cho người dùng của bạn. Bí quyết là tải UIWebView với một trang không có thật ngoài màn hình, trong khi khởi chạy ứng dụng của bạn. Tạo một trang web tối thiểu HTML5 trong chuỗi được mã hóa cứng. Tôi sử dụng nội dung HTML5 chính xác và hợp lệ để giảm thiểu thời gian do UIWebView/WebKit thực hiện để phân tích.

Kỹ thuật này hoạt động khá tốt trên phần cứng thực (iPhone 3GS), không chỉ là iOS Simulator.

Trong các đại biểu ứng dụng của tôi didFinishLaunchingWithOptionsmethod, dưới cùng của mã -compliant ARC trông như thế này:

… 
[self.window makeKeyAndVisible]; 

// Performance optimization: Warm up the UIWebView widget and its related WebKit libraries. 
// We are choosing the trade-off between (A) a slight delay here during app launch to create and abandon a bogus UIWebView instance, and 
// (B) a flash of white and noticeable delay as the UINavigationController slides in from the right the first UIWebView we display during the app run. 
UIWebView* bogusWebView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
NSString* html = @"<!doctype html><html lang=en><head><meta charset=utf-8><title>blah</title></head><body><p>bogus content</p></body></html>"; 
[bogusWebView loadHTMLString:html baseURL:nil]; // Load the page. 
bogusWebView = nil; // Not really needed, but self-documents that we intend to discard this object. 

return YES; 

Kỹ thuật này dường như để giảm nhất nhưng không hoàn toàn tất cả các sự chậm trễ nửa giây xấp xỉ trong sử dụng của xuất hiện đầu tiên của UIWebView trên màn hình. Tôi kết luận rằng hầu hết các sự chậm trễ là do WebKit nóng lên, nhưng phải có một số chi phí liên quan đến đồ họa trình bày một UIWebView trên màn hình. Nếu vậy, chúng tôi không thể loại bỏ phần còn lại còn lại bằng công việc ngoài màn hình. Tuy nhiên, kỹ thuật này loại bỏ hầu hết các sự chậm trễ ban đầu của. Vì vậy, ấn tượng đầu tiên của người dùng về ứng dụng của tôi sẽ không bị "chậm".

+0

THANK YOU !!!!! webkit thực sự cần được làm ấm lên –

+0

Đây phải là câu trả lời được chấp nhận –