Добавление слоя модели (с кэшированием) для UIWebViews; проблема с UIWebViewNavigationType и shouldStartLoadWithRequest - PullRequest
3 голосов
/ 25 августа 2009

Я работаю над добавлением слоя модели в приложение iPhone, чтобы я мог сериализовать / расставлять приоритеты HTTP-запросов и выборочно кэшировать ответы. Благодаря UIWebViewDelegate, следующий метод делает это довольно просто (теоретически):

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

По сути, мой код проверяет навигационный тип, отправляет запрос модели и возвращает НЕТ. В свою очередь, уровень модели обрабатывает запрос и, когда завершено, вставляет данные обратно в UIWebView, используя:

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

К сожалению, при отправке данных обратно в UIWebView я часто вижу, что shouldStartLoadWithRequest снова запускается (на этот раз с навигационным типом 5, но с использованием того же URL-адреса, что и исходный запрос). Я не могу полагаться на то, что модель будет обслуживать это из кэша (так как URL-адрес идентичен предыдущему), поэтому мне нужно, чтобы UIWebView обрабатывал его сам, возвращая YES.

Я бы хотел избежать этого, чтобы модель (и уровень кэширования) видели и обрабатывали все запросы. Кто-нибудь есть какие-либо идеи, почему я вижу NavigationType 5 во вторичном mustStartLoadWithRequest?

1 Ответ

4 голосов
/ 02 сентября 2009

Я реализовал приложение, используя ту же стратегию, что и вы, и боролся с той же проблемой.

Навигационный тип, который вы видите - UIWebViewNavigationTypeOther. В моем приложении я видел этот навигационный тип как в моем первоначальном запросе, так и в запросе, который возник в результате моего вызова loadData: MIMEType: textEncodingName: baseURL. Не было никакой возможности определить разницу на основе предоставленных параметров.

Решение вызвало у меня дрожь, но оно было на 100% надежным. На практике каждый раз, когда вызывается webView: shouldStartLoadWithRequest: navigationType: вызвано моим вызовом loadData: MIMEType: textEncodingName: baseURL, поэтому я решил эту проблему, создав флаг BOOL с именем loadCachedData и переключив его между YES и НЕТ каждый раз, когда webView: ShouldStartLoadWithRequest: navigationType: вызывается. Если бы флаг был ДА, я бы пропустил запрос. Иначе я бы окунулся в свой кеш. Работал как шарм.

...