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 kolejkiNie 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!