Dando proseguimento ao artigo anterior, dessa vez vamos utilizar a classe NSURLConnection, uma classe que lida com conexões assíncronas e ajuda a lidar com timeouts, redirecionamentos e erros. Vamos voltar ao nosso aplicativo anterior.
1. Abra o GetContentWebViewController.h e adicione a seguinte variável de instância que manterá os dados da página web:
NSMutableData * conteudoDados;
2. Em GetContentWebViewController.m troque stringWithContentOfURL por:
conteudoDados = [[NSMutableData alloc] initWithData:nil];
NSURLRequest *req=[[NSURLRequest alloc] initWithURL:url];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
Nisso inicializamos um objeto que manterá os dados da nossa página web. Criamos um objeto do tipo NSURLRequest para nossa requisição através da do objeto url com nossa endereço e fazemos a conexão usando NSURLConnection que enviará mensagens ao delegador em diversos pontos durante a conexão.
3. Próximo passo é implementar os métodos delegadores.
connection:didReceiveData:
esse método delegador é chamado quando algum dado é recebido e aqui você simplesmente adiciona esses dados nos recebidos previamente.
connection:didFailWithError:
chamado quando ocorre algum error.
connectionDidFinishLoading:
chamdo quando os dados terminam de carregar pela conexão criada, depois disso, aqui você cria por exemplo a string com os dados a serem exibidos em conteudoDados.
Abaixo o código como ficou depois da modificação com os métodos delegadores, repare também no código comentádo:
Nisso inicializamos um objeto que manterá os dados da nossa página web. Criamos um objeto do tipo NSURLRequest para nossa requisição através da do objeto url com nossa endereço e fazemos a conexão usando NSURLConnection que enviará mensagens ao delegador em diversos pontos durante a conexão.
3. Próximo passo é implementar os métodos delegadores.
connection:didReceiveData:
esse método delegador é chamado quando algum dado é recebido e aqui você simplesmente adiciona esses dados nos recebidos previamente.
connection:didFailWithError:
chamado quando ocorre algum error.
connectionDidFinishLoading:
chamdo quando os dados terminam de carregar pela conexão criada, depois disso, aqui você cria por exemplo a string com os dados a serem exibidos em conteudoDados.
Abaixo o código como ficou depois da modificação com os métodos delegadores, repare também no código comentádo:
#import "GetContentWebViewController.h"
@implementation GetContentWebViewController
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[conteudoDados appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
UIAlertView *meuAlerta = [[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[meuAlerta show];
[meuAlerta release];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSString *cotacao = [[NSString alloc]initWithBytes:[conteudoDados bytes] length:[conteudoDados length] encoding:NSASCIIStringEncoding];
resultadosView.text = cotacao;
[cotacao release];
}
- (void)viewDidLoad {
NSLog(@"começou");
CGRect resultadoFrame = CGRectMake(10, 10, 300, 100);
resultadosView = [[UITextView alloc] initWithFrame:resultadoFrame];
resultadosView.font = [UIFont systemFontOfSize:14.0];
[self.view addSubview:resultadosView];
NSString *symbol = @"AAPL+GOOG";
NSString *urlString = [NSString stringWithFormat:@"http://finance4444.yahoo.com/d/quotes.csv?s=%@&f=sndlllyr",symbol];
NSURL *url = [NSURL URLWithString:urlString];
//NSString *cotacao = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
conteudoDados = [[NSMutableData alloc] initWithData:nil];
NSURLRequest *req=[[NSURLRequest alloc] initWithURL:url];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
[req release];
[conn release];
//resultadosView.text = cotacao;
NSLog(@"Terminou");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)dealloc {
[resultadosView release];
[conteudoDados release ];
[super dealloc];
}