从网站上提取文本的NSURLConnection只获取一些数据

时间:2012-03-22 20:30:37

标签: objective-c cocoa-touch nsurlconnection

我正在尝试从网页中提取一些数据。我有部分工作,但它只是从这个网页而不是全部拉出一小段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;
}

我需要做什么才能获得整个页面?

2 个答案:

答案 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:而不是旧的委托路由,因为它会使您的代码更简单,更易读。