NSURLConnection не запускается - PullRequest
0 голосов
/ 10 мая 2009

Я пытаюсь создать очень простое приложение, которое подключается к URL-адресу и получает содержимое этого URL-адреса, в данном случае простой XML-документ. Моя проблема в том, что запрос никогда не отправляется.

Я создал новый проект (инструмент Foundation), который запускается из основного файла. Я установил делегировать NSURLConnection к себе и реализовать необходимые методы делегата. Проблема в том, что эти методы никогда не вызывают. Неважно, если я изменю URL для некоторых поддельных (как в примере ниже). Мне кажется, что приложение завершает запуск без отправки или ожидания ответа. Может ли быть так, что мое приложение создает поток для запроса, а затем завершает работу, не дожидаясь ответа? Я знаю, что класс работает, так как я получаю операторы NSLOG типа "Создано соединение ", но нет NSLOG-операторов из методов делегата.

Чего мне не хватает?

#import "NetworkController.h"
@implementation NetworkController

- (id)init
{
    if(self = [super init])
    {

    }   
    return self;
}
- (void)dealloc
{
    NSLog(@"Calling dealloc");
    [super dealloc];
}
- (void) performConnection
{
    NSMutableData *receivedData;
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:
                                       @"http://www.test.php?some variables"]];

    NSMutableURLRequest *connectionRequest = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
    [url release];
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:connectionRequest delegate:self startImmediately:YES];

    if (!theConnection)
    {
        NSLog(@"Failed to submit request");
    }
    if(theConnection)
    {
        receivedData=[[NSMutableData data] retain];
        NSLog(@"Created connection.");

        NSLog(@"--------- Request submitted ---------");
        NSLog(@"receivedData: %@", receivedData);
    }

    [connectionRequest release];
}

#pragma mark NetworkController Delegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"Received response: %@", response);
    NSLog(@"Received response, connection retain count is %d",[connection retainCount]);
}

#pragma mark NetworkController Delegate
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"Connection received data, retain count: %d", [connection retainCount]);
}

#pragma mark NetworkController Delegate
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"finished connection retain count:  %d", [connection retainCount]);}

#pragma mark NetworkController Delegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Error receiving response: %@", error);
    [connection release];
}

@end

#import <Foundation/Foundation.h>
#import "NetworkController.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


    NetworkController *n = [[NetworkController alloc] init];
    n.performConnection;
    [n release];

    // insert code here...
    NSLog(@"Hello, World!");
    [pool drain];
    return 0;
}

1 Ответ

2 голосов
/ 10 мая 2009

Во-первых, синтаксис сообщения:

[n performConnection];

Имеется синтаксис доступа к свойствам. И поскольку метод напечатан как возвращающий void, я бы не принял его как гарантированно работающего даже на этом уровне.

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

Вам необходимо запустить цикл выполнения до того, как вы отпустите сетевой контроллер, чтобы дать время соединения, чтобы отправить запрос, прочитать ответ и отправить сетевому контроллеру несколько сообщений делегата. Вам также необходимо cancel и release соединение в методе dealloc сетевого контроллера.

Кроме того, вам необходимо сделать эту переменную NSMutableData переменной экземпляра, поскольку вам нужно иметь возможность получить ее из методов делегата. Не забудьте также выпустить это в вашем методе deallocrelease it и установить его в nil в обоих методах делегата, которые указывают, что соединение установлено).

...