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