Threads são usadas para que a execução de dois ou mais processos ocorram simultâneamente. Veremos aqui como podemos implementá-las na plataforma iOS.
Em nosso exemplo, vamos carregar um imageView com uma imagem da internet passando apenas sua URL. Para que o efeito fiquei bem visível, peguei uma imagem bem grande, acima de 2MB.
Mãos à obra: inicie um projeto do tipo View-based Application e dê o nome de “EstudoThread”.
No arquivo de interface (ThreadViewController.xib), coloque um Button, um Activity Indicator View, um slider e um imageView. Vai ficar parecido com o exemplo a seguir:
No arquivo ThreadViewController.h, crio os seguintes Outlets e Actions:
@interface ThreadViewController : UIViewController{
IBOutlet UIImageView *imageView;
IBOutlet UIActivityIndicatorView *loading;
}
-(IBAction)loadImage:(id)sender;
@end
O passo seguinte é implementar esse método loadImage, então vamos abrir o arquivo ThreadViewController.m e adicionar o trecho de código a seguir:
-(void)loadImage:(id)sender{
[loading startAnimating];
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://gamehall.uol.com.br/galerias/_cinehall_kingkong/kong_iup2.jpg"]];
[imageView setImage:[UIImage imageWithData:data]];
[loading stopAnimating];
}
Faça as devidas conexões dos objetos com os outlets e actions criados e rode a aplicação para ver o resultado.
Repare que enquanto a imagem está sendo carregada a tela ficará travada. Isso acontece porque ainda ainda não estamos usando as Threads e nada será liberado para uso enquanto o processo de carregamento não terminarde processar o carregamento da imagem.
Dependendo do tempo de carregamento, essa demora pode ser um incômodo para o usuário que terá a impressão de que sua app travou. Então, vamos implementar a thread para resolver esse problema.
Para aplicar a thread, adicionei mais um método (downloadImage) e alterei o loadImage, ficando assim:
-(void)loadImage:(id)sender{
[loading startAnimating];
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
}
-(void)downloadImage{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://gamehall.uol.com.br/galerias/_cinehall_kingkong/kong_iup2.jpg"]];
[imageView setImage:[UIImage imageWithData:data]];
[loading stopAnimating];
[pool release];
}
Não se esqueça de declarar esse novo método no arquivo ThreadViewController.h
Rode sua aplicação. Veja que agora, enquanto sua imagem é carregada, a tela fica liberada para o usuário navegar.
Uma observação: aqui usei o AutoReleasePool, prática comum até o lançamento do iOS5. A versão mais nova do iOS agora conta com um garbage collector, chamado ARC, que torna desnecessário chamá-lo.
Até a próxima!