NSURLConnection didReceiveData não chamado
Eu li várias mensagens dizendo a mesma coisa novamente: quando você usa uma NSURLConnection, os métodos delegados sãonão chamado. Eu entendo que doc da Apple são incompletos e referência métodos depreciados, o que é uma pena, mas não consigo encontrar uma solução.
Código para o pedido está lá:
// Create request
NSURL *urlObj = [NSURL URLWithString:url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlObj cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
if (![NSURLConnection canHandleRequest:request]) {
NSLog(@"Can't handle request...");
return;
}
// Start connection
dispatch_async(dispatch_get_main_queue(), ^{
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; // Edited
});
... e código para os métodos delegados está aqui:
- (void) connection:(NSURLConnection *)_connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"Receiving response: %@, status %d", [(NSHTTPURLResponse*)response allHeaderFields], [(NSHTTPURLResponse*) response statusCode]);
self.data = [NSMutableData data];
}
- (void) connection:(NSURLConnection *)_connection didFailWithError:(NSError *)error {
NSLog(@"Connection failed: %@", error);
[self _finish];
}
- (void) connection:(NSURLConnection *)_connection didReceiveData:(NSData *)_data {
[data appendData:_data];
}
- (void)connectionDidFinishDownloading:(NSURLConnection *)_connection destinationURL:(NSURL *) destinationURL {
NSLog(@"Connection done!");
[self _finish];
}
Não há muita verificação de erros aqui, mas tenho certeza de algumas coisas:
Aconteça o que acontecerdidReceiveData
éNunca chamado, então eu não recebo nenhum dado... mas os dados são transferidos (verifiquei usandotcpdump
)... e os outros métodos são chamados com sucesso.Se eu usar oNSURLConnectionDownloadDelegate
ao invés deNSURLConnectionDataDelegate
, tudo funciona, mas não consigo segurar o arquivo baixado (esse é um bug conhecido)A solicitação não é desalocada antes da conclusão por mau gerenciamento de memóriaNada muda se eu usar uma página HTML padrão em algum lugar da internet como meu URLO pedido é retirado da fila principalNão quero usar uma biblioteca de terceiros, pois, em última análise, essas solicitações devem ser incluídas em uma biblioteca minha e eu gostaria de minimizar as dependências. Se eu tiver que usarCFNetwork
diretamente, mas será uma dor enorme no you-know-what.
Se você tem alguma ideia, isso ajudaria muito. Obrigado!