NSURLConnection didReceiveData не вызывается

Я прочитал тонны сообщений, в которых снова и снова повторялось одно и то же :когда вы используете NSURLConnection, методы делегата не вызываются . Я понимаю, что документ Apple неполный и ссылается на устаревшие методы, и это позор, но я не могу найти решение.

Код для запроса есть:

// 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
});

... и код для методов делегата здесь:

- (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];
}

Здесь не так много проверок ошибок, но я убедился в нескольких вещах:

  • Что бы ни случилось, didReceiveDataникогда не вызывается , поэтому я не получаю никаких данных
  • ...но данные передаются (я проверял с помощьюtcpdump)
  • ... и другие методы вызываются успешно.
  • Если я использую NSURLConnectionDownloadDelegateвместо NSURLConnectionDataDelegate, все работает, но я не могу получить загруженный файл (это известная ошибка)
  • Запрос не освобождается до завершения из-за неправильного управления памятью
  • . Ничего не изменится, если я использую стандартную HTML-страницу где-нибудь в Интернете в качестве своего URL-адреса
  • Запрос стартует из основной очереди

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

Если у вас есть какие-либо идеи, это очень поможет. Спасибо!

6
задан F.X. 10 July 2012 в 20:04
поделиться