iPhone - вызовите php-страницу асинхронно и убедитесь, что она загружена

В одном из моих приложений я хотел бы асинхронно вызвать страницу php, которую я написал (http://serveradress/page.php?date=20111231), и я был бы уверен, что знаю, можно ли вызвать страницу (нет Ошибка 404, php-сервер не работает, настроенная страница 404, отсутствие подключения к Интернету или что-то в этом роде). Я планировал сделать так, чтобы php-страница возвращала очень простую HTML-страницу с просто «ОК» в теле или заголовке.

Это будет «фантомный» вызов без использования какого-либо UIWebView или, если ДЕЙСТВИТЕЛЬНО необходимо, скрытый UIWebView, но я бы предпочел этого избежать.

Не могли бы вы помочь мне написать этот звонок ?
И обязательно узнать, загрузился ли он?

Я видел, что мне, вероятно, следует использовать NSURLConnection, но я немного растерялся.

Не могли бы вы помочь мне ?


person Oliver    schedule 07.05.2011    source источник


Ответы (1)


NSURLConection — очень хорошее решение для асинхронной загрузки. Есть несколько шагов для его создания.

<сильный>1. Настройте NSURLConnection

- (void)viewDidLoad {
    // your code...
    responseData = [[NSMutableData alloc] init];
    NSURL *url = [NSURL URLWithString:@"http://yourdomain.com/"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]];
}

responseData – это iVar NSMutableData.

<сильный>2. Реализовать методы делегирования

а) В этом методе мы будем проверять коды состояния HTTP

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)]) {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode >= 400) {
            [connection cancel]; 
            NSDictionary *errorInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:NSLocalizedString(@"Server returned status code %d",@""),statusCode] forKey:NSLocalizedDescriptionKey];
            NSError *statusError = [NSError errorWithDomain:NSHTTPPropertyStatusCodeKey code:statusCode userInfo:errorInfo];
           [self connection:connection didFailWithError:statusError];
        }
    }
}

б) Это создает ваш компонент NSData

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

c) Обрабатывает успешное соединение URL

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // do whatever you want using responseData as your server output
}

г) Обрабатывает ошибки

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // handle your error
}

Вы можете получить информацию об ошибке с помощью [error userInfo] и отобразить ее, например, в UIAlertView.


Итак, как я уже сказал, NSURLConnection — очень хорошее решение, но вам также следует взглянуть на библиотеку ASIHTTPRequest< /а>. :)

person akashivskyy    schedule 07.05.2011
comment
@Kashiv: Спасибо, я пытаюсь это сделать. Интересно, как я могу узнать тип значения, возвращаемого в NSData? Это может быть что угодно, кроме строки... - person Oliver; 07.05.2011
comment
@Kashiv: NSHTTPPropertyStatusCodeKey си сказал, что он устарел. Что я должен использовать вместо этого. Ищу замену, но не нахожу подходящей. Странная вещь, даже если она считается устаревшей, NSHTTPPropertyStatusCodeKey не распознается во время компиляции. Это единственная ошибка. - person Oliver; 08.05.2011
comment
Простите за это. В качестве errorDomain можно использовать любую строку, например @HTTPStatusCode. Пожалуйста, проверьте, работает ли это ;) - person akashivskyy; 08.05.2011
comment
@Kashiv: Да :-) Это то, что я сделал :-) Но для NSData я могу получить строку, которую отправляю сам, но я также могу получить любые другие вещи, если запрос не будет успешным, как я ожидаю. Как я могу узнать, какие данные я получил? - person Oliver; 08.05.2011
comment
Какие данные может вернуть ваш сервер? - person akashivskyy; 08.05.2011
comment
@Кашив: я не знаю. Это не МОЙ сервер. Это моя веб-страница, и сервер может вернуть все, что захочет, если он не хочет, чтобы моя веб-страница была доступна. - person Oliver; 09.05.2011
comment
Но какой тип данных? Я имею в виду изображение, текст, html, страницу ошибки и т. д.? Вы можете использовать id obj = [NSKeyedUnarchiver unarchiveObjectWithData:responseData]; и после этого if([obj isKindOfClass:[NSString class]]) или [UIImage class] . Затем с помощью оператора if вы можете обрабатывать его несколькими способами. Но если ваш сервер вернет неверный код состояния, вместо этого будет вызываться connection:didFailWithError:. - person akashivskyy; 10.05.2011
comment
@Kashiv: именно это я и имел в виду. Спасибо ! - person Oliver; 10.05.2011