E se eu tivesse um DeLorean?!

Transcrição

E se eu tivesse um DeLorean?!
E se eu tivesse um DeLorean?!
Dicas para o Eu do passado
Marcelo Fabri
Dextra Sistemas
http://www.dextra.com.br/
@marcelofabri_
E se eu tivesse um DeLorean?!
Planejamento
• Por onde começar?
• Dicas gerais
• Problemas de performance
• Bibliotecas úteis
Por onde começar?
• iOS Dev Center
https://developer.apple.com/devcenter/ios
• Vídeos da WWDC
https://developer.apple.com/videos
• Ray Wenderlich
http://raywenderlich.com/
• StackOverflow
http://stackoverflow.com
Conheça o ecossistema
• Acostume-se com Objective-C e seus paradigmas!
• Se possível, tenha um iDevice
• iOS Human Interface Guidelines
http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig
• App Store Review Guidelines
https://developer.apple.com/appstore/guidelines.html
http://www.textfromxcode.com
Mantenha-se atualizado
• Mudanças no SDK a cada major release
• Objective-C muda também!
• Modern Objective-C
•
Compatível com iOS anteriores
http://clang.llvm.org/docs/ObjectiveCLiterals.html
NSArray* arr = @[obj1, obj2, obj3, obj4];
NSLog(@"%@", arr[0]);
NSDictionary* dict = @{@"quatro": @4, @"flag": @YES, @"vetor": arr,
@"texto" : @"TDC 2012!"};
NSLog(@"%@", dict[@"texto"]);
iOS6 - O que vem por aí?
17:40
Ferramentas
• TestFlight
https://testflightapp.com
• CocoaPods
http://cocoapods.org
• Dev Rocket
http://devrocket.uiparade.com
Gerenciamento de memória
• Use o ARC!
• Cuidado com leaks
Gerenciamento de memória e ARC
13:10
Threads
• Nunca trave a thread principal
• I/O, laços demorados...
• Use Grand Central Dispatch (GCD) ou
NSOperationQueue
• Atualizações de UI apenas na thread principal
GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUE
UE_PRIORITY_DEFAULT, 0), ^{
// algo demorado...
dispatch_async(dispatch_get_main_queue(), ^{
// atualização de UI
view.hidden = NO;
});
});
Cuidado com nil
• Você pode mandar mensagens pra nil (retornam nil)
• Vantagem ou desvantagem?
• Mais difícil de depurar
• Objetos que não foram instanciados
NSMutableSet* aSet;
// ...
[aSet addObject:obj];
// ...
[aSet anyObject];
Customização de Inteface
• Não use categories
• UIAppereance (iOS 5+)
• Herança
Customização de Inteface
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width,
self.frame.size.height)];
}
@end
[[UINavigationBar appearance] setBackgroundImage:img
forBarMetrics:UIBarMetricsDefault];
@interface CustomNavigationBar : UINavigationBar
@end
@implementation CustomNavigationBar
-(void) drawRect:(CGRect)rect
{
UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width,
self.frame.size.height)];
}
@end
Seja preguiçoso
• Não faça nada até que seja necessário
• Carregar imagens, nibs, instanciar NSDateFormatters
• Elementos de tela: apenas quando estiverem visíveis
•
Scrollviews, tableviews
if (! formatter) {
formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterMediumStyle;
formatter.timeStyle = NSDateFormatterLongStyle;
}
return formatter;
Reutilize
• Instanciar objetos é custoso
• Cuidado com NSCalendar, NSDateFormatter
• Prefira criar datas a partir de timestamps, e não strings
• Cerca de 25x mais rápido (sem contar a inicialização do
formatter)
• Sempre use o reuseIdentifier em UITableViews
• Utilize a ideia em seus componentes de tela
Verifique a performance
• Simulador != dispositivo
• Static Analyzer
• Instruments
• Não ache. Meça.
• Tenha certeza
• Otimize
• Meça de novo
Recebendo dados remotos
• Assincronamente, sempre!
• GZIP no servidor
• HTTP com JSON/XML
• Evite ter que tratar estruturas
• Balanceie dados remotos e locais
• Google App Engine
Desenhando
• Nunca chame drawRect: de maneira explicíta
• Chame setNeedsDisplay
• Declare views opacas quando possível
• OpenGL ES? GLKit?
Bibliotecas úteis
• Alguém já deve ter feito isso...
• AFNetworking
• QuickDialog
• JSONKit
• CorePlot
• MBProgressHUD
• Reachability
• ShareKit
• SFHFKeychainUtils
• SSToolkit