2012-02-10 43 views
6

Tôi đã đọc rằng việc sử dụng lại UIWebViews là một thực tiễn không tốt. Một số mã tôi thừa kế tại nơi làm việc đang đẩy nhiều nội dung khác nhau vào một UIWebView. Powerpoints, tài liệu Word và video. Tất cả điều này chỉ hoạt động tốt trong những hoàn cảnh bình thường. Khi chúng tôi chuyển đổi nội dung trong UIWebView quá nhanh, nó sẽ đổ.Việc sử dụng lại UIWebView gây ra sự cố

Chế độ xem web của tôi được đặt làm thuộc tính. Nó được nối trong IB tốt. Lựa chọn bình thường từ tableView của chúng tôi tải nội dung địa phương tốt. Phải mất lựa chọn lửa nhanh chóng của cùng một tế bào hoặc kết hợp của nhiều để làm cho nó sụp đổ.

Tôi có thể chụp một số thông báo lỗi cho nó cho webViewDidFailWithError. Nhưng những thứ đó sẽ kích hoạt ngay cả khi không có sự cố. Đây là chuỗi lỗi được bản địa hoá.

The operation couldn’t be completed. (NSURLErrorDomain error -999.) 

Khi ứng dụng cuối cùng gặp sự cố, nó sẽ phát sinh lỗi này.

Application Crash image

Nếu ai có bất kỳ liên kết hoặc một số ví dụ mã cách xử lý này, tôi sẽ đánh giá cao nó. Có lẽ một ví dụ làm thế nào để tốt nhất tái sử dụng tài sản webView của tôi mà không thổi những thứ lên.

Tôi sẽ tải một số mã của mình, nhưng có rất nhiều điều xảy ra không liên quan đến chính webView. Tất cả nội dung được đẩy lên webView được thực hiện qua [self.webView loadRequest:request]; với yêu cầu là một NSURLRequest được điền đầy đủ đường dẫn đến nội dung cục bộ.

Tôi sẽ rất đánh giá cao nếu có ai có thể giúp tôi thực hiện việc này. Ngón tay vượt qua cho một cái gì đó đơn giản.

+0

Có thể bạn nên chặn tương tác của người dùng trong khi webView của bạn tải yêu cầu. –

+0

Điều đó có thể có thể, nhưng không chắc chắn khách hàng của chúng tôi sẽ đi cho nó. Tôi sẽ xem xét điều đó. Cảm ơn. –

+0

Bạn đã thử nó với '@try {} @catch {}' chưa? –

Trả lời

2

Tôi không chắc chắn theo cách này là cách "tốt nhất" để giải quyết vấn đề, nhưng dường như nó hoạt động khá tốt. Ngắn, ngọt, và nó hoạt động.

Tôi đã tắt người dùngTương tác với bảngXem nội dung cập nhật nội dung trong webView. Vì bạn phải nghiền nát nó rất nhiều, thiếu một cái vòi ở đây hoặc có lẽ sẽ không thể bỏ qua. Vì vậy, bây giờ, đây là sửa chữa.

#pragma mark - 
#pragma mark UIWebViewDelegate methods 

-(void)webViewDidStartLoad:(UIWebView *)webView { 
    [self.tableView setUserInteractionEnabled:NO]; 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.tableView setUserInteractionEnabled:YES]; 
} 

// I re-enable on load failures as they can block you out entirely on fail 
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    [self.tableView setUserInteractionEnabled:YES]; 
} 
0

Bạn đang sử dụng [webview stopLoading]; trước khi tải một yêu cầu khác? Những gì bạn có thể cần làm là hủy hoặc ngừng tải hiện tại trước khi thử tải một tệp khác. Tùy chọn khác đang hạn chế đầu vào của người dùng.

+0

Tôi đã thử đặt [self.webView stopLoading]; trước khi tôi gọi loadRequest mới, nhưng nó không tạo ra bất kỳ sự khác biệt nào, vẫn bị treo. –

+0

Có vẻ như vấn đề nằm trong khu vực đó. Nếu nó chỉ treo khi bạn nhanh chóng khai thác thì vấn đề phải được với nhiều yêu cầu. Đối với giới hạn người dùng nhập vào nó không phải là cho đến khi nó kết thúc tải. Bạn có thể thử bỏ qua các chạm trong một nửa hoặc toàn bộ giây để xem có khắc phục được sự cố không. – Jaybit

+0

Vâng, tôi chắc chắn nó sẽ sửa chữa nó. Nhưng không thực sự giải quyết vấn đề. Tôi có thể đập vào nó khá nhanh và nó nắm giữ. Thực sự chỉ gặp sự cố với khai thác không thực tế. Công việc muốn tôi tìm ra cách ngăn ngừa sự cố, nếu nó có thể xảy ra. Cảm ơn vì sự thấu hiểu. –

1

Nếu chỉ gặp sự cố khi bạn nhấn nhanh, bạn có thể đặt trình nhận dạng cử chỉ lên trên để hoạt động như giới hạn tốc độ của người nghèo không?

+0

Trình nhận dạng cử chỉ trên tableView -didSelectRowAtIndexPath? –

+0

Trên bất kỳ chế độ xem nào đang kích hoạt các yêu cầu, do đó bạn không gửi chúng quá thường xuyên. –

0

Trong UIWebViewDelegate của bạn, bạn có thể thực hiện webView:shouldStartLoadWithRequest:navigationType: trở NO nếu đã có một tải yêu cầu.

0

Tôi không thể không nghĩ rằng bạn không nên sử dụng lại UIWebView. Mương ngòi, tạo nó theo lập trình và đặt nó thành nil và tạo lại/gán lại/phân bổ lại khi nguồn dữ liệu thay đổi.

Trên một lưu ý khác, tôi sẽ đảm bảo sử dụng NSOperationQueue để tải dữ liệu.

+0

Cảm ơn lời khuyên. Thật không may, bàn tay của tôi bị trói buộc trong vấn đề. Chúng tôi đã tìm ra cách để vượt qua nó. Chúng tôi đang tạo UIView với chỉ báo tiến trình cho biết nó vẫn đang tải và ngăn người dùng quá tải chế độ xem web. Nó hoạt động, khách hàng hạnh phúc, tất cả những gì tôi có thể hy vọng. Cảm ơn vì lời khuyên. –

+0

Nghe có vẻ giống như một sự thỏa hiệp tốt. – ader

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