Upload
marcelo-fabri
View
865
Download
2
Embed Size (px)
DESCRIPTION
Já imaginou como seriam as coisas se você soubesse o que você sabe hoje, alguns anos atrás? Essa palestra tem como objetivo dar algumas dicas que eu queria ter recebido, em relação ao ecossistema iOS, performance, código, e muito mais!(Palestra apresentada na trilha de iOS do TDC SP 2012)
Citation preview
E se eu tivesse um DeLorean?!
Marcelo FabriDextra Sistemashttp://www.dextra.com.br/@marcelofabri_
Dicas para o Eu do passado
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 WWDChttps://developer.apple.com/videos
• Ray Wenderlichhttp://raywenderlich.com/
• StackOver!owhttp://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
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 Rockethttp://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_QUEUE_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
@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
Customização de Inteface
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
• Pre"ra 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 reuseIdenti!er em UITableViews
•Utilize a ideia em seus componentes de tela
Veri"que 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
• JSONKit
• CorePlot
•MBProgressHUD
• Reachability
• ShareKit
• SFHFKeychainUtils
• SSToolkit
•QuickDialog