NSURLConnection didReceiveData nie został wywołany

Przeczytałem mnóstwo komunikatów, powtarzając to samo: kiedy używasz NSURLConnection, są metody delegowanianie wezwany. Rozumiem, że dokument Apple'a jest niekompletny i odwołuje się do przestarzałych metod, co jest wstydem, ale nie mogę znaleźć rozwiązania.

Kod dla żądania jest tam:

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

... i kod metod delegowania jest tutaj:

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

Nie ma tu zbyt wiele błędów, ale upewniłem się o kilku rzeczach:

Cokolwiek się zdarzy,didReceiveData jestnigdy zadzwoniłem, więc nie dostaję żadnych danych... ale dane są przesyłane (sprawdziłem za pomocątcpdump)... i inne metody są nazywane pomyślnie.Jeśli korzystam zNSURLConnectionDownloadDelegate zamiastNSURLConnectionDataDelegate, wszystko działa, ale nie mogę zatrzymać pobranego pliku (jest to znany błąd)Żądanie nie zostało zwolnione przed zakończeniem przez złe zarządzanie pamięciąNic się nie zmieni, jeśli użyję standardowej strony HTML gdzieś w Internecie jako mojego adresu URLŻądanie zostaje wyrzucone z głównej kolejki

Nie chcę korzystać z biblioteki innej firmy, ponieważ ostatecznie żądania te mają być zawarte w mojej własnej bibliotece i chciałbym zminimalizować zależności. Jeśli będę musiał, użyjęCFNetwork bezpośrednio, ale będzie to ogromny ból w tym, co wiesz.

Jeśli masz jakiś pomysł, bardzo by to pomogło. Dzięki!

questionAnswers(4)

yourAnswerToTheQuestion