UIWebView webViewDidStartLoad вызывается с запросом, свойства которого равны нулю

#iphone #performance #uiwebview

#iPhone #Производительность #uiwebview

Вопрос:

В настоящее время я отлаживаю UIWebView, чтобы получить некоторую информацию для повышения производительности (на сервере и iPhone). Я заметил, что после вызова loadRequest: обратный вызов

 - (void)webViewDidStartLoad:(UIWebView *)webView_ 
  

вызывается, однако каждый параметр запроса равен нулю.

Я использую следующее утверждение:

     - (void)webViewDidStartLoad:(UIWebView *)webView_{
    NSLog(@"%@ t Start Request: %@ n absolute: %@ n Method: %@ n Parameters: %@ n Port: %@ n Query: %@ n Header Fields: %@ n HTTPBody: %@ n HTTPBodyStream: %@", [NSDate date], [[webView_ request] mainDocumentURL], [[[webView_ request] mainDocumentURL] absoluteString], [[webView_ request] HTTPMethod], [[[webView_ request] mainDocumentURL] parameterString], [[[webView_ request] mainDocumentURL] port], [[[webView_ request] mainDocumentURL] query], [[webView_ request] allHTTPHeaderFields], [[webView_ request] HTTPBody], [[webView_ request] HTTPBodyStream]);
}
  

Вывод таков:

  2011-05-11 17:15:34  0200    Start Request: (null) 
 absolute: (null) 
 Method: GET 
 Parameters: (null) 
 Port: (null) 
 Query: (null) 
 Header Fields: {
} 
 HTTPBody: (null) 
 HTTPBodyStream: (null)
  

Есть ли какое-либо объяснение такому поведению или что-нибудь, чтобы это исправить?

Страница загружается нормально, однако загрузка запроса, похоже, ничего не занимает около 30 секунд, чего я стараюсь избегать.

редактировать: некоторая дополнительная информация о загрузке webview. Я вызываю метод, который добавляет webview в UIView и загружает URL

     UIWebView * web = [[UIWebView alloc] initWithFrame:CGRectMake(indent, topindent indent, screenSize.width-2*indent, screenSize.height-2*indent-topindent)];
     web.delegate = self;
    [view addSubview:web];
    NSURLRequest * someUrl = [NSURLRequest requestWithURL:[NSURL URLWithString:
@"some_URL"]];
    [web loadRequest: someUrl];
  

Комментарии:

1. Я вижу точно такое же поведение, не уверен, что с этим делать!

Ответ №1:

Причина, по которой вы не видите запрос, заключается в том, что свойство запроса webview не назначается до тех пор, пока запрос не будет загружен. Скорее всего, это покажет только фактический отображаемый запрос после всех перенаправлений. Если вам нужен исходный объект запроса, перед перенаправлением и т.д., Используйте ответ ТоддА. Для окончательного запроса вам нужно будет проверить его в webViewDidFinishLoad.

Ответ №2:

Что ж, после борьбы с этой же проблемой я обнаружил, что решение заключается в использовании этого метода UIWebViewDelegate:

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

Он вызывается непосредственно перед viewDidStartLoad и передается объект запроса, с которым будет загружаться представление.

Комментарии:

1. Я использовал этот обратный вызов, чтобы отследить, какой URL вызывается. Однако я обнаружил, что он не дает точной информации о времени загрузки запроса и о порядке.

2. Используйте эту функцию, и если вы вернете YES, то будет вызван метод didStartLoading.

Ответ №3:

Единственное, что вы не проверили, это свойство URL запроса. Проверьте это и посмотрите, что вы получите:

 [[[webView_ request] URL] absoluteString]
  

Редактировать:

Похоже, у вас могут возникнуть проблемы с автоматически выпущенными объектами. Попробуйте создать NSURL отдельно от NSURLRequest:

 NSURL *myURL = [NSURL URLWithSTring:@"some_URL"];
NSURLRequest *someUrl = [NSURLRequest requestWithURL:myURL];
[web loadRequest:someUrl];
  

Комментарии:

1. true, к сожалению, не предоставляет никакой полезной информации — просто пустая строка: Запрос запуска: (null) URL: Метод: ПОЛУЧЕНИЕ параметров: (null) Порт: (null) Запрос: (null) Поля заголовка: { }

2. Хм, что ты пытаешься получить, и когда это вызывается? Как вы загружаете запрос в Webview

3. Я добавил информацию о загрузке запроса к первоначальному вопросу

4. к сожалению, ничего не изменилось

5. попробуйте также перегрузить webview:shouldStartLoadWithRequest: метод делегата и посмотрите, что вы получите из запроса там