NSURLConnection для получения текста с сайта получает только некоторые данные - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь получить некоторые данные с веб-страницы.У меня он частично работает, но он извлекает только фрагмент 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 ]

3 голосов
/ 23 марта 2012

didReceiveData: использует куски, чтобы обеспечить не только самую быструю загрузку, но и возможность загружать массивные файлы без объекта NSData объемом 2 ГБ и сбой приложения из-за слишком большого объема памяти.сделать, это создать 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;
}

Вы можете фактически удалить ответ как переменную экземпляра в этом случае (если вам это не понадобится позже).

0 голосов
/ 23 марта 2012

connection:didReceiveData: вызывается каждый раз, когда поступает больше данных, не обязательно только один раз.Поэтому вместо того, чтобы каждый раз создавать новую строку и отбрасывать оригинал (что приведет к утечке, если вы не используете компилятор ARC), вы, вероятно, захотите создать новую строку и добавить ее к своим текущим рабочим результатам.Например,

- (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: вместо старого маршрута делегата, так как это делает ваш код проще и удобочитаемее.

...