@property (retain, nonatomic) NSArray *elementos;
@property (weak, nonatomic) IBOutlet UIScrollView *scroll;
@end
Agora temos diversas tarefas para fazer, de tal maneira que, ao iniciar, o aplicativo
conecte-se a API do 500px, baixe as informações das últimas fotos postadas pelos
usuários, e mostre-as em um scroll na medida que interagimos com ele. A lista de
tarefas pode ser resumida desta maneira:
Configurar os blocks de sucesso e erro do AFNetworking
Configurar o scroll, para que tenha tamanho suficiente para comportar todas
as imagens
Pré-gerar os componentes de imagens (porém sem carregá-las ainda)
Código para carregar uma determinada imagem
Carregar as outras imagens à medida que interagimos com o scroll
6.6
Configurar os blocks de sucesso e erro do AF-
Networking
A primeira parte do código ficará no método viewDidLoad, que é um método de-
clarado na classe UIViewController da qual a nossa classe ViewController herda
(note que os nomes são muito parecidos, cuide para não fazer confusão). Ele é exe-
cutado automaticamente pelo iOS assim que a view do controller é carregada em
memória, portanto é um bom lugar para preparar o controller para uso, como inici-
alizar variáveis, criar outras views auxiliares etc.
Lembre-se dos imports
Não esqueça de importar o arquivo AFNetworking.h, através da
instrução #import "AFNetworking.h" logo no início do arquivo
ViewController.m
112
Casa do Código
Capítulo 6. Realizando operações com a Internet
1 -(void) viewDidLoad
2 {
3
[super viewDidLoad];
4
5
NSString *url = @"http://bit.ly/livroios-500px";
6
AFHTTPRequestOperationManager *manager =
7
[AFHTTPRequestOperationManager manager];
8
9
manager.responseSerializer = [AFJSONResponseSerializer serializer];
10
11
[manager GET:url parameters:nil
12
success:^(AFHTTPRequestOperation *operation, id json) {
13
_elementos = json[@"photos"];
14
[self mostraMensagem:[NSString
15
stringWithFormat:@"%d imagens encontradas",
16
_elementos.count]];
17
18
if (_elementos.count > 0) {
19
[self inicializaScroll];
20
}
21
}
22
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
23
[self mostraMensagem:[NSString stringWithFormat:@"Erro: %@",
24
[error localizedDescription]]];
25
}
26
];
27 }
A linha 9 configura o request para lidar com dados JSON, utilizando uma classe
própria para isso do AFNetworking, a AFJSONResponseSerializer. Na linha
12 declaramos o bloco de sucesso, sendo que o último parâmetro id json é
o que conterá os dados do JSON em si, porém já convertidos para um NSDictionary
pelo AFNetworking. Esta é a parte em que usar AFJSONResponseSerializer é
vantajoso, pois caso contrário teríamos que lidar manualmente com alguma biblio-
teca JSON. Na linha 13 pegamos todos os itens retornados pelo 500px, e guardamos
para uso posterior na classe.
113
6.7. Configurar o scroll e pré-gerar os componentes de imagens
Casa do Código
Como saber o que terá no NSDictionary?
Dois detalhes importantes: primeiro, a declaração do bloco success
passa o parâmetro json como sendo do tipo id, que é um tipo coringa.
Se você conhece Java ou C#, é como se fosse o Object destas lingua-
gens. Além disso, a documentação do AFNetworking não diz nada ex-
plicitamente que o tipo passado será um NSDictionary, porém nos testes
realizados foi este o caso, então assume-se que ao menos será um tipo
compatível. Em segundo lugar, uma maneira fácil de descobrir a estru-
tura dos dados no dicionário (que foi a usada a primeira vez que utili-
zei a biblioteca) é simplesmente jogar o conteúdo no console, através de
NSLog(@"%@", json). Como você pode ver, não há nenhuma má-
gica envolvida, apenas um pouco de programação orientada à tentativa
e erro
O block failure, na linha 22, simplesmente mostra a mensagem de erro ao usuá-
rio, caso a requisição falhe por qualquer motivo.
6.7
Configurar o scroll e pré-gerar os componen-
tes de imagens
O componente UIScrollView que adicionamos no arquivo Main.storyboard foi
criado apenas com as configurações padrão, e agora vamos definir o tamanho da área
em que o usuário poderá navegar, assim como adicionar as outras views que serão
responsáveis por mostrar as imagens. Uma das propriedades mais importantes do
UIScrollView é a contentSize, que especifica a largura e altura do conteúdo e que,
dependendo dos valores informados e do tamanho da tela, permite que o usuário
faça scroll para cima ou para baixo. O tipo da propriedade contentSize é CGSize,
que é uma estrutura que comporta largura e altura, com ponto flutuante ( float),
e é relativa ao tamanho do frame do scroll. Portanto, se o scroll tem 320x480 de
tamanho, um contentSize com as mesmas dimensões não permitirá a rolagem do
conteúdo, porém se o contentSize for de, digamos, 3200x500, será possível rolar uma
grande quantidade na horizontal, e um pouco na vertical. Simples assim.
1 -(void) inicializaScroll {
2
float largura = self.scroll.bounds.size.width;
114
Casa do Código