我已经阅读了大量的消息,一遍遍地重复着同样的事情:当你使用 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
,一切正常,但我无法保留下载的文件(这是一个已知的错误) - 错误的内存管理在完成之前不会释放请求
- 如果我在 Internet 上的某个地方使用标准 HTML 页面作为我的 URL,什么都不会改变
- 请求从主队列中启动
我不想使用第三方库,因为最终这些请求将包含在我自己的库中,并且我想最小化依赖关系。如果必须,我会CFNetwork
直接使用,但这将是你知道的一个巨大的痛苦。
如果您有任何想法,那将有很大帮助。谢谢!