«- (void) соединение: (NSURLConnection *) соединение didReceiveData: (NSData *) данные» не вызвано - PullRequest
2 голосов
/ 07 августа 2009

Посмотрите на этот фрагмент кода: -

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{               
    [webData setLength: 0];           
}



-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{
    NSLog(@"Recieving Data...");
    [webData appendData:data];

}



-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"ERROR with theConenction");
    [connection release];
    [webData release];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSLog(theXML);


}   

Я звоню в веб-службу SOAP. В моем коде нет ошибок или предупреждений. Когда я запускаю веб-сервис через сафари, он работает нормально. Но проблема возникает, когда я пытаюсь ударил это через мои коды. Все работает нормально, но connection:didRecieveData не вызывается. Таким образом, я не получаю данных в переменной webData. Этот webData является NSMutableData объектом. Проблема кажется глупой, но любой с любыми ответами ....

Спасибо всем.

Ответы [ 4 ]

4 голосов
/ 07 августа 2009

Я подозреваю, что у вас проблема с управлением памятью. Я могу ошибаться в этом, но я считаю, что даже:

NSURLConnection* connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];

не будет работать, потому что connection будет освобожден в конце содержащего метод, когда connection выйдет из области видимости. Убедитесь, что NSURLConnection *connection и NSMutableData *data объявлены как переменные-члены везде, где вы делаете это, и что вы alloc и init соответственно. Мой код обычно выглядит так:

    NSURLRequest *request = [NSURLRequest requestWithURL:url
                                          cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                          timeoutInterval:30.0];
    // cancel any old connection
    if(connection) {
        [connection cancel];
        [connection release];
    }
    // create new connection and begin loading data
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if(connection) {
        // if the connection was created correctly, release old data (if any), and alloc new
        [data release];
        data = [[NSMutableData data] retain];
    }

Также release соединение и данные в dealloc. Для правильного измерения, release и установите их на nil в самом конце didFailWithError и didFinishLoading:

[connection release];
connection = nil;
[data release];
data = nil;

Удачи; Я делал это миллион раз, дайте мне знать, если вы не можете заставить его работать.

2 голосов
/ 07 августа 2009

Вы случайно не вызываете NSConnection в потоке? Если это так, то происходит то, что поток завершается до NSConnection, а его делегаты заканчивают работу, поэтому он просто разорится без ошибки.

Обходной путь для этого находится в этом потоке

0 голосов
/ 24 апреля 2012

Также могут возникнуть проблемы, если вы пытаетесь запустить NSURLConnection из другого потока. Пожалуйста, вызовите метод [start connection] в главном потоке, если вы не настроили Run Loop для него.

0 голосов
/ 07 августа 2009

Вы также не получаете никаких сообщений об ошибках в didFailWithError? Это глупое предложение, но вы уверены, что устанавливаете правильный NSURLConnection делегат?

NSURLConnection* connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];

Иногда это что-то маленькое.

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

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