我正在尝试从网页中提取一些数据。我有部分工作,但它只是从这个网页而不是全部拉出一小段HTML。这是我的实现代码:
- (void)viewWillAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:@"http://waterdata.usgs.gov/ga/nwis/uv?cb_72036=on&cb_00062=on&format=gif_default&period=1&site_no=02334400"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
if (connection) {
// Connect
label.text = @"Connecting...";
} else {
// Error
}
}
- (void)connection:(NSURLConnection *) connection didReceiveData:(NSData *)data {
response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
-(void)connectionDidFinishLoading: (NSURLConnection *)connection {
label.text = response;
connection = nil;
}
我需要做什么才能获得整个页面?
答案 0 :(得分:3)
didReceiveData:
拉入块以确保不仅下载速度最快,而且可以在没有2GB NSData对象的情况下下载大量文件,并使应用程序崩溃以占用太多内存。
您要做的是创建一个NSMutableData
实例变量。
在视图控制器的init方法或连接开始时分配并初始化它。
在didReceiveData:
中,您只需将数据附加到NSMutableData
- (void)connection:(NSURLConnection *) connection didReceiveData:(NSData *)data {
[myData appendData:data];
}
然后在connectionDidFinishLoading:
-(void)connectionDidFinishLoading: (NSURLConnection *)connection {
response = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
label.text = response;
}
在这种情况下,您实际上可以将响应删除为实例变量(除非您以后需要它)。
答案 1 :(得分:0)
connection:didReceiveData:
,而不一定只调用一次。因此,不是每次都创建一个新的字符串而丢弃原始字符串(如果你不使用ARC编译器就会泄漏),你可能想要创建一个新的字符串并将其附加到当前的工作结果中。 E.g。
- (void)connection:(NSURLConnection *) connection didReceiveData:(NSData *)data {
newResponse = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
[response appendString:newResponse];
}
假设response
是您之前创建的可变字符串,并且我已添加autorelease
以防您不使用ARC编译器。
如果您使用的是iOS 5,您还应该认真考虑使用sendAsynchronousRequest:queue:completionHandler:
而不是旧的委托路由,因为它会使您的代码更简单,更易读。