Я прочитал тонны сообщений, в которых снова и снова повторялось одно и то же :когда вы используете 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
, все работает, но я не могу получить загруженный файл (это известная ошибка)Я не хочу использовать стороннюю -библиотеку, так как, в конечном счете, эти запросы должны быть включены в мою собственную библиотеку, и я хотел бы свести к минимуму зависимости. Если понадобится, я воспользуюсь CFNetwork
напрямую, но это будет огромная проблема, -вы знаете -что.
Если у вас есть какие-либо идеи, это очень поможет. Спасибо!