Выполнение запросов GET и POST из приложения iPhone - требуется уточнение - PullRequest
5 голосов
/ 11 января 2009

Я следую вместе с полезным ответом на мой вопрос .

Вроде бы работает, но у меня есть два вопроса:

  1. Как я могу обнаружить ошибку HTTP? Похоже, что метод didFailWithError не вызывается?

ОБНОВЛЕНИЕ: Он считает любой ответ успешным . Таким образом, я предполагаю, что должен обрабатывать ошибки HTTP в методе didRecieveResponse, но помимо сообщения пользователю, что при ошибке HTTP произошла ошибка, нужно ли каким-то образом останавливать соединение? И / или очистка?

  1. Я вижу эту строку в ответе:
[[NSURLConnection alloc] initWithRequest:request delegate:self];

Мне нужно выпустить это? Где, как, когда?

Ответы [ 3 ]

4 голосов
/ 11 января 2009

Вы получите код состояния, возвращенный в didReceiveResponse

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSHTTPURLResponse *httpResponse;
    httpResponse = (NSHTTPURLResponse *)response;
    int statusCode = [httpResponse statusCode];
    //statusCode will be the http code returned like 201,500
 }

Для остановки соединения используйте переменную уровня класса для соединения. Лучший способ сделать это - создать оболочку, которая отправляет запросы и получает ответ. Сделайте ваш viewcontroller делегатом этого класса, и всякий раз, когда didReceiveResponse выдает код ошибки, вызывайте соответствующий метод делегата и прекращайте соединение.

Вот хороший пример класса оболочки

http://kosmaczewski.net/projects/objective-c-rest-client/

3 голосов
/ 11 января 2009

Да, вам нужно освободить этот объект. См. Руководство по программированию управления памятью для какао . По сути, если вы когда-либо создаете объект с именем метода, который начинается с alloc или new или содержит copy, вы становитесь владельцем объекта и несете ответственность за его последующее освобождение. Только в том случае, если вы знаете, что вам понадобится объект до завершения программы, можно не освобождать его, и в этом случае операционная система освобождает память после завершения работы приложения.

Если вам нужен только объект в небольшом объеме, вы можете отправить ему сообщение autorelease. Это добавит его в пул автоматического выпуска. Пул автоматического выпуска периодически отправляет сообщение release каждому объекту в нем. Это довольно сложно; см. раздел о пулах автоматического выпуска . Например:

В этом случае, однако, поскольку NSURLConnection являются асинхронными, автоматическое освобождение не будет работать. Вы не знаете точно, когда он будет вызывать ваш объект с данными, поэтому вы хотите убедиться, что объект еще не был освобожден. Единственный способ убедиться, это точно знать, когда вы закончили с объектом, а затем отправить ему сообщение release.

Все различные функции init* возвращают указатель на данный объект, поэтому вы можете просто сделать:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
...
// when done with connection:
[connection release];
0 голосов
/ 18 марта 2009

Отвечая на вопрос в вашем "обновлении" ...

Немедленно автоматически выпустить NSURLConnection. Объект подключения сохраняется NSRunLoop (к которому он добавляется автоматически, если вы не используете конструктор startImmediately: NO). Он будет автоматически удален из цикла выполнения (и, следовательно, dealloc'd) при ошибке или завершении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...