Presented at Mobile Conf Rio 2014, Brazil. The content is in Brazilian Portuguese. Discussion of the Delegate pattern and its implementation in iOS API. Samples from the SDK and a custom interaction using delegates. Shows techniques such as performSelector: calls, delegation through protocol and delegation using blocks. Code samples: https://github.com/osnipso/mobileconf2014
Caelum IP-67 course on iOS (in Brazilian Portuguese): http://www.caelum.com.br/curso-ios-iphone-ipad/
3. CONHECIMENTO
• Básico de Objective-C
• Conceitos fundamentais do iOS
• Views
• Actions
• Outlets
slideshare.net/osnipso/primeiros-passos-no-ios-com-objectivec
4. DELEGATES
• Padrão de Projeto (Design Pattern)
• Divisão de responsabilidades
• Princípio da responsabilidade única
• Comunicação entre objetos
• Inversão de Controle (IoC)
6. IMPORTÂNCIA
• É *o* padrão mais importante no iOS
• Muito utilizado pela API
• Muito utilizado pelos desenvolvedores
• Imprescindível compreender
• Necessário dominar
• Boa prática utilizar - padronização
7. DEFINIÇÕES
• Delegation (iOS Developer Library - Cocoa Core
Competencies)
https://developer.apple.com/library/ios/documentation/general/conceptual/DevPedia-CocoaCore/
Delegation.html
• Delegates and Data Sources (iOS Developer Library -
Concepts in Objective-C Programming)
https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/
DelegatesandDataSources/DelegatesandDataSources.html#//apple_ref/doc/uid/TP40010810-CH11
8. CONCEITO
Apple (Cocoa Core Competencies):
Delegação é um padrão simples e poderoso em que um
objeto em um programa age no lugar de, ou em coordenação
com outro objeto.
(...)
O objeto que delega é tipicamente um objeto do framework e
o delegado é tipicamente um objeto controller customizado.
13. CONCEITO
Dois objetos colaboram para realizar uma tarefa.
O primeiro, faz até onde ele consegue fazer.
O que ele não consegue? Delega para o segundo!
17. EXEMPLO: UIAlertView
• Sabe exibir a mensagem e os botões
• Sabe qual botão foi tocado (“clicado”) pelo usuário
• Não sabe o que fazer a partir desse ponto!
• Depende da aplicação
• Aciona o delegado para fazer
20. EXEMPLO:
UIImagePickerController
• Sabe exibir a galeria de imagens/vídeos (câmera, etc.)
• Sabe qual image/vídeo foi selecionado pelo usuário
• Não sabe o que fazer a partir desse ponto!
• Depende da aplicação
• Aciona o delegado para fazer
21. OUTROS EXEMPLOS
• UITableView
• UITableViewDelegate (interação com UI / exibição avançada)
• UITableViewDataSource (exibição básica)
23. E O CONTRATO?
• Acoplamento a um protocolo específico
• Melhor que acoplar diretamente à classe...
• Obrigatoriedade de implementar todas as mensagens (?)
• Péssimo. Implementações vazias, adapters, etc.
24. EXEMPLO - SEM PROTOCOLO
• UIPickerController, porém
seleciona ao confirmar
• Permite cancelar seleção
• Exibido como modal
25. EXEMPLO - SEM PROTOCOLO
• MYPickerViewController é quem implementa
UIPickerViewDataSource, UIPickerViewDelegate
(MYPickerViewController.h)
@interface MYPickerViewController : UIViewController <UIPickerViewDataSource,
UIPickerViewDelegate>
• Exibe conteúdo fixo
• Seguindo a mesma idéia, podemos perguntar a um
DataSource o que exibir... (desafio)
26. EXEMPLO - SEM PROTOCOLO
• Precisamos usar performSelector:
• Delegate pode ser genérico, mas precisa implementar o
protocolo NSObject
(MYPickerViewController.h)
@property (weak, atomic) id<NSObject> delegate;
(MYPickerViewController.m)
if ([self.delegate respondsToSelector:@selector(pickedItem:)]) {
[self.delegate performSelector:@selector(pickedItem:)
withObject:@(self.selectedItem)];
}
27. EXEMPLO - SEM PROTOCOLO
• Problemas com o compilador:
• Até dá pra desligar esse aviso, mas...
29. EXEMPLO - SEM PROTOCOLO
Prós:
• Menos trabalho
• Sem implementações
desnecessárias, adapters
Contras:
• Contrato implícito!
• Sem autocomplete
• Sem ajuda do compilador
• Muito limitado!
34. EXEMPLO - COM
PROTOCOLO
Prós:
• Contrato explícito
• Com autocomplete
• Com ajuda do compilador
• Mais flexível e poderoso
Contras:
• Mais trabalho
Com @optional:
• Sem implementações
desnecessárias, adapters
• Continua autocomplete!
38. EXEMPLO - COM BLOCOS
MYPickerViewController ViewController
void (^cancelBlock)(MYPickerViewController *pickerViewController);
void (^successBlock)(MYPickerViewController *pickerViewController,
NSInteger itemIndex);
Contrato está na assinatura do bloco!
bloco
bloco (cópia)
39. EXEMPLO - COM BLOCOS
Prós:
• Contrato explícito
• Com ajuda do compilador
• (Ainda) mais flexível e
poderoso
Contras:
• Uma propriedade por
callback
• Sintaxe bizarra!
• Problemas de
gerenciamento de
memória...
40. EXEMPLO - COM BLOCOS
• Dá pra melhorar um pouquinho a sintaxe...
(MYPickerViewController.h)
typedef void (^MYPickerViewControllerCancelBlock)
(MYPickerViewController *pickerViewController);
typedef void (^MYPickerViewControllerSuccessBlock)
(MYPickerViewController *pickerViewController,
NSInteger itemIndex);
@property (copy, atomic) MYPickerViewControllerCancelBlock cancelBlock;
@property (copy, atomic) MYPickerViewControllerSuccessBlock successBlock;
41. EXEMPLO - COM BLOCOS
• Cuidado com ciclos de retenção!
MYPickerViewController ViewController
bloco
bloco (cópia de self - “strong”)
picker
pickerViewController (strong)
42. EXEMPLO - COM BLOCOS
Cuidado:
• Fechamento (closure) no escopo da instância
• Programação funcional - paradigma misto
• Extensão da linguagem C, ainda não padronizada
Curiosidade:
• Sintaxe é a mesma de ponteiro de função (“*” vira “^”)
44. DICAS
• Procure entender o conceito (callback...?)
• Observe as APIs e como elas utilizam o padrão
• Na dúvida, implemente com protocolos (tradicional)
• APIs novas usam cada vez mais blocos - tendência