2010-10-27 11 views
0

Im делает проект, в котором я подключаюсь к веб-странице с помощью NSURLConnection, чтобы отслеживать возвращаемые коды состояния (200 OK/404 ERROR). Я хотел бы отправить пользователя на верхний URL-адрес www.domain.com, если я получу 404 в качестве кода статуса, и если я получу код статуса из 200, я бы хотел загрузить страницу в веб-просмотр. Я видел несколько реализаций этой проблемы, создав новый запрос, но я чувствую, что это не нужно, поскольку вы уже получили html в первом запросе, поэтому я просто хотел бы загрузить этот HTML-код в webView.Загрузить HTML NSString в UIWebView

Поэтому я пытаюсь использовать [webView loadHTMLFromString: baseURL:], но он не всегда работает, я заметил, что когда я печатаю NSString с html в connectionDidFinnishLoading, он иногда имеет значение NULL и когда я контролирую эти случаи печать html в didReceiveData случайное число последних пакетов равно NULL (отличается от 2-10). Это всегда одни и те же веб-страницы, которые не загружаются. Если я загружу их в свой webView с помощью [webView loadRequest: myRequest], он всегда работает. Моя реализация выглядит так, возможно, кто-то из вас может видеть, что я делаю неправильно.

Создайте свой первый запрос нажатием кнопки.

-(IBAction)buttonClick:(id)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://www.domain.com/page2/apa.html"]; 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url] 
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if(theConnection) 
    { 
     webData = [[NSMutableData data] retain]; 
    } 
    else 
    { 

    } 
} 

Затем я контролировать код ответа в методе didReceiveResponse литья запроса к NSHTTPURLResponse, чтобы иметь возможность получить доступ к кодам состояния, а затем установив Bool в зависимости от кода состояния.

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{  
    NSHTTPURLResponse *ne = (NSHTTPURLResponse *)response; 
    if ([ne statusCode] == 200) { 
     ok = TRUE; 
    } 

    [webData setLength: 0]; 
} 

Затем я проверяю значение bools в соединенииDidFinnishLoading. Если я зарегистрирую html NSString, я получаю источник веб-страницы, поэтому я знаю, что это не пустая строка.

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 

    NSString *html = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 

    NSURL *url = [NSURL URLWithString:@"http://www.domain.com/"]; 
    if (ok) { 
     [webView loadHTMLString:html baseURL:url]; 
     ok = FALSE; 
    } 
    else { 
     // Create a new request to www.domain.com 
    } 

} 

webData - это переменная экземпляра, и я загружаю ее в didReceiveData следующим образом.

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [webData appendData:data]; 
} 
+0

какие ошибки вы видите? вы просто сказали, что он не работает? –

+0

Я не получаю ошибок компилятора, но UIWebView полностью пуст, хотя он вызвал и методы делегата webViewDidStartLoad и webViewDidFinishLoad: – ehenrik

ответ

0

Вы смешиваете два способа выполнения соединения - синхронно и асинхронно. Если асинхронное завершение перед синхронным, вы повторно инициализируете webData пустым строком. Поэтому, даже если синхронно заполнено webData, оно будет очищено.

// you create asynchronous connection which starts downloading in background immediately 
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
// you create another synchronous connection which will block until the URL is downloaded 
[NSURLConnection sendSynchronousRequest:theRequest returningResponse: &responseHeader error: nil]; 

// assuming your theRequest is valid, theConnection is always non-nil, so this is always TRUE 
if (theConnection) { 
    // you reset content of webData, so if your synchronous connection has downloaded something, you throw it away here 
    webData = [[NSMutableData data] retain]; 
} else ... 

Попробуйте удалить ненужные/ошибочный вызов sendSynchronousRequest:returningResponse:error: и он может работать.

В любом случае - где вы заполняете webData с данными? Вы реализовали connection:didReceiveData: и добавили то, что приходит в webData, правильно? Если вы этого не сделали - ну, это проблема, которую вы видите.

+0

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

+0

Ну, я надеялся, что вы реализовали этот метод, но реальную проблему я описал в начале моего ответа. Похоже, вы не читали внимательно, поэтому я добавил код с комментариями к ответу сейчас. – Michal

+0

Я использовал случайные сбои, которые указывали на некоторую ошибку с webData, так как я сделал изменения, о которых вы говорили об этих сбоях, остановились. Огромное спасибо! Но, тем не менее, первая проблема, которую я все еще сопротивлялся. Я заметил, что он может загружать некоторые веб-страницы, а некоторые другие нет. В случае, когда это не работает, я заметил, что NSString возвращает null connectionDidFinnishLoading, но если я печатаю данные в didReceiveResponse, я получаю некоторые данные, но последние пакеты поступают как null (отличается от 2 до 10 пакетов). – ehenrik

0

Я предполагаю, что webData является переменной экземпляра на вашем классе. Я думаю, ваша проблема в том, что вы не устанавливаете webData на данные, которые вы получаете от NSURLConnection. Попробуйте что-то вроде этого:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [webData appendData:data]; 
} 

Если это не сделать трюк, попробуйте добавить в NSLog() после NSString *html = [[NSString alloc]... линии, например, так:

NSLog(@"HTML: %@", html);

Это скажет вам, будь вы получаете HTML или нет, и проблема связана с вашим кодом NSURLConnection или с вашим UIWebViewIBOutlet.

+0

Извините, что не написал это в моем вопросе, но я зарегистрировал NSString, как вы описали, и я получаю источник веб-страницы. Мне удалось загрузить еще одну веб-страницу с моим кодом, но некоторые страницы не будут загружаться. Похоже, он поддерживает только «чистый» html, например, www.pinball.org/rules, а не html базы данных, например www.pinballhighscores.org/highscores.php?filter_game=medieval+madness – ehenrik

+0

HTML - это HTML. Неважно, был ли HTML статическим .html-файлом или был ли он создан из записей базы данных. Если вы знаете, что у вас есть действующий HTML, следующая проверка - это веб-просмотр. Если вы попробуете '[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: @" http://www.google.com "]]]', это работает? –

+0

Я заметил, что он может загружать некоторые веб-страницы, а некоторые другие нет. В тех случаях, когда это не работает, я заметил, что NSString возвращает null в connectionDidFinnishLoading, но если я печатаю данные в didReceiveResponse, я получаю некоторые данные, но последние пакеты поступают как null (отличается от 2 до 10 пакетов). – ehenrik

Смежные вопросы