Desenvolvimento

23 jul, 2012

Utilizando Threads no iOS

Publicidade

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!