quinta-feira, 17 de março de 2011

Tarefas comuns de rede no iOS - Parte 2


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:



#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];
}

@end


Abaixo screens do app em execução, sem internet, com internet e com a url errada:





Nenhum comentário:

Postar um comentário