NSURLConnection не вызывает методы делегата - PullRequest
15 голосов
/ 23 июля 2010

Я видел подобные вопросы здесь, но я не мог найти решение моей проблемы.У меня есть простой NSURLConnection в главном потоке (по крайней мере, я не создавал никаких других потоков), но мои методы делегата не вызываются

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

и методы не вызываются, например

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"didReceiveResponse");
}

self также является делегатом для NSXMLParser, но я думаю, что это не должно быть проблемой, так как у меня это работает в моем другом классе в том же проекте.Я уже все проверил 10 раз, но не могу найти никаких проблем.

Я видел какой-то взлом, чтобы решить эту проблему здесь: http://www.depl0y.com/?p=345 но мне это не нравится, может быть, кто-то знаетлучшее решение?спасибо

Ответы [ 5 ]

27 голосов
/ 23 июля 2010

Единственная причина, которую я знаю, - это отдельный поток (который уже завершается при вызове методов делегата).

Попробуйте NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT")); прямо перед созданием соединения с URL

15 голосов
/ 10 января 2012

Попробуйте запустить соединение в главном потоке:

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

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
            forMode:NSDefaultRunLoopMode];
[connection start];
4 голосов
/ 23 июля 2010

Авторелиз опасен. Вызовы делегату выполняются после возврата вашей функции (асинхронно). Вы сохраняете это где-то еще?

1 голос
/ 25 марта 2012

Я думаю, вы могли пропустить NSURLConnectionDelegate в заголовочном файле вашего класса.

Например:

@interface yourClass : NSObject <NSURLConnectionDelegate>
1 голос
/ 23 июля 2010

Вы должны release объект NSURLConnection в обратном вызове - (void)connectionDidFinishLoading:(NSURLConnection *)connection, как указано в документации Apple, а не в другом месте:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
  // Do whatever you want here

  // Release the connection
  [connection release];
}

Не выпускать его с autorelease,как предложил Лу Франко.

Если это не проблема, то, возможно, вам придется реализовать все необходимые методы в классе делегата:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

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

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

Делегат удерживается NSURLConnection, поэтому вам не нужно об этом беспокоиться.

...