NSURLConnection не вызывает методы делегирования

Я видел похожие вопросы здесь, но я не мог найти решение моей проблемы. У меня есть простой 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, но мне это не нравится, может быть, кто-то знает лучшее решение? спасибо

Ответы

Ответ 1

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

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

Ответ 2

Попробуйте подключиться к основному потоку:

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

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
            forMode:NSDefaultRunLoopMode];
[connection start];

Ответ 3

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

Ответ 4

Вы должны 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, поэтому вам не о чем беспокоиться.

Ответ 5

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

Например:

@interface yourClass : NSObject <NSURLConnectionDelegate>