Ответ 1
Единственная причина, по которой я знаю, - это отдельный поток (который уже завершается при вызове методов делегата).
Попробуйте NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT"));
прямо перед созданием соединения URL.
Я видел похожие вопросы здесь, но я не мог найти решение моей проблемы. У меня есть простой 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, но мне это не нравится, может быть, кто-то знает лучшее решение? спасибо
Единственная причина, по которой я знаю, - это отдельный поток (который уже завершается при вызове методов делегата).
Попробуйте NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT"));
прямо перед созданием соединения URL.
Попробуйте подключиться к основному потоку:
NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
[connection start];
Автореферат опасен. Вызовы делегата выполняются после возвращения функции (асинхронно). Вы сохраняете его где-то еще?
Вы должны 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
, поэтому вам не о чем беспокоиться.
Я думаю, что вы, возможно, пропустили NSURLConnectionDelegate
в своем файле заголовка класса.
Например:
@interface yourClass : NSObject <NSURLConnectionDelegate>