Методы делегата NSURLConnection не вызываются

Я пытаюсь создать простое соединение NSURLConnection для связи с сервером с помощью запроса GET. Соединение работает хорошо, но методы делегатов NSURLConnection никогда не вызываются.

Вот что делаю:

NSString *post = [NSString stringWithFormat:@"key1=%@&key2=%@&key3=%f&key4=%@", val1, val4, val3, val4];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease] ;

[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.domain.com/demo/name/file.php?%@", post]]];

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

Реализованы следующие методы делегата, но ни один из них не вызывается ..

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"did fail");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"did receive data");
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"did receive response ");
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"did finish loading");
    [connection release];
}

Я что-то упускаю?


person Manish Ahuja    schedule 26.04.2011    source источник
comment
вы подключены к Интернету ??   -  person Inder Kumar Rathore    schedule 26.04.2011
comment
Можете ли вы убедиться, что ни одна из ваших переменных по какой-либо причине в этот момент не равна нулю?   -  person Ryan Wersal    schedule 26.04.2011
comment
проверьте значение переменной connection, так как по какой-то причине она может иметь нулевое значение.   -  person Inder Kumar Rathore    schedule 26.04.2011


Ответы (4)


Попробуйте запустить операцию в основном потоке:

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

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
                      forMode:NSDefaultRunLoopMode];
[connection start];
person Art    schedule 10.01.2012
comment
какой тупой API, даже когда вызываю его в основном потоке, мне все равно нужно это делать. - person yano; 28.03.2014
comment
LinkedIn SDK - отстой. Это отличное решение! - person Pedro Góes; 20.08.2015
comment
Объясните, почему вы должны запускать его в основном потоке: github.com/rs/ SDWebImage / issues / 213 # issuecomment-10102989 - person Sisyphus; 23.01.2016

Вы вызываете это в фоновом потоке? Если вы выполняете это в фоновом потоке, поток, вероятно, завершается до того, как могут быть вызваны делегаты.

person visakh7    schedule 26.04.2011
comment
Я попытался использовать NSLog (@ Is% @ main thread, ([NSThread isMainThread]? @: @ NOT) непосредственно перед тем, как создать соединение, и он вернет это Main thread - person Manish Ahuja; 26.04.2011
comment
для правильной работы соединения цикл выполнения вызывающего потока должен работать в режиме цикла выполнения по умолчанию. Ты тоже можешь это проверить? - person visakh7; 26.04.2011
comment
Я выяснил, в чем проблема ... и у меня тоже все заработало. Но мне все же хотелось бы получить некоторые пояснения по этому поводу ... На самом деле я создал соединение внутри статического метода класса, и функции делегата никогда не вызывались ... И когда я создавал соединение внутри метода экземпляра, все работает нормально ... delgate теперь вызываются функции ... Итак, теперь вопрос в том, в чем разница, когда соединение создается внутри статического метода или оно создается внутри метода экземпляра? - person Manish Ahuja; 26.04.2011

Попробуйте проверить длину полученного ответа, он не должен получать 0 байт данных.

person sanjeev sharma    schedule 13.08.2012

Помимо проверки, вызывается ли запрос из основного потока, вы можете проверить, возвращаете ли вы время выполнения системе (если вы выходите из «основного»). У меня был тестовый код, который оставался в цикле до тех пор, пока делегат не был вызван: он никогда не вызывался, потому что системе нужно что-то делать, чтобы делегат был вызван в основном потоке.

person user3292568    schedule 10.02.2014