Как я могу получить данные с URL на iPhone? - PullRequest
3 голосов
/ 27 февраля 2009

Я использую код из документа Apple для связи по HTTP. Я могу подключиться к URL-адресу успешно, но мне не удалось получить данные с моего сервера.

// create the request
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://..."]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                        timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData that will hold
    // the received data
    // receivedData is declared as a method instance elsewhere
    NSMutableData *receivedData=[[NSMutableData data] retain];
} else {
    // inform the user that the download could not be made
}

Причиной может быть:

  1. Я объявляю receivedData в самом действии. Аннотация говорит, что я должен объявить это в другом месте. Где я должен это объявить? Должен ли я объявить его как свойство контроллера?

  2. Как [[NSMutableData data] retain] найти URL-адрес, находящийся вне if{}?

1 Ответ

5 голосов
/ 27 февраля 2009

Когда вы используете метод initWithRequest: делегат: метод NSURLConnection, данные (вместе с другими вещами) отправляются объекту делегата в последовательности вызовов методов. Все методы являются необязательными, поэтому, если ваш объект-делегат не реализует их, объект соединения просто пропускает их.

Существует множество методов, поэтому я не буду перечислять их все здесь, но они все подробно описаны в документации NSURLConnection. Чтобы получить полученные данные, вы захотите реализовать -connection: didReceiveData: в объекте делегата. Этот метод будет вызван, возможно, более одного раза, с объектом NSData, представляющим вновь полученные данные. Затем вы можете добавить это к существующему объекту NSMutableData или сделать все остальное, что имеет смысл. Вы будете знать, что вы получили все данные, когда -connectionDidFinishLoading: вызывается для объекта делегата.

Чтобы ответить на два ваших конкретных вопроса:

  1. Да, вы должны объявить его как свойство объекта контроллера. Вы также должны убедиться, что выделили объект ДО, вызывая NSURLConnection в initWithRequest: делегат:, потому что соединение начнет загружать данные асинхронно, как только будет создан объект соединения. В качестве альтернативы вы можете реализовать -connection: didReceiveResponse: в делегате, проверить статус HTTP и затем создать объект данных.

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

...