SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
iOS,APIs, performance
e sincronização de
dados
Maurício Linhares - @mauriciojr
http://techbot.me/
sábado, 10 de setembro de 2011
WHO?
• GUJeiro de raiz - 01/2005
• Ruby, Objective-C, Java e Scala developer na
http://officedrop.com/
• Nas horas vagas escreve no blog, grava
screencasts e joga boardgames europeus;
sábado, 10 de setembro de 2011
Como entramos no
mercado?
• Aplicação pra iPad a época do lançamento
do primeiro iPad;
• Aplicação pra Mac á época do lançamento
da Mac App Store;
• Aplicação pra iPhone (recente);
sábado, 10 de setembro de 2011
Por que investir em iOS
e Mac?sábado, 10 de setembro de 2011
A vida é injusta
sábado, 10 de setembro de 2011
Build a Mac app?
sábado, 10 de setembro de 2011
Por investir em iOS e
Mac?
sábado, 10 de setembro de 2011
Em números
• Primeiros dois meses da aplicação pra iPad,
45% de crescimento em sign ups a cada
mes;
• Primeiros dois meses do ScanDrop for the
Mac, 13% de crescimento;
• Primeiros dois meses de aplicação pra
Android, 14% de crescimento;
• Primeiros dois meses de lançamento da
aplicação pra iPhone, 51% de crescimento;
sábado, 10 de setembro de 2011
E tem mais?
• A mídia americana (nosso mercado
principal) adora Macs;
• Todos os reviews das aplicações desktop
pra Windows (temos duas) reclamavam da
inexistência do Mac;
• Se você tem versão pra Mac e iOS, as
pessoas falam de você com mais facilidade;
sábado, 10 de setembro de 2011
Plataforma
• Desenvolvimento usando XCode;
• Em Objective-C, C e C++;
• Ambiente de desenvolvimento exclusivo
para o Mac (mas é possível compilar no
Linux);
sábado, 10 de setembro de 2011
Objective-C é difícil?
sábado, 10 de setembro de 2011
Performance?
sábado, 10 de setembro de 2011
Performance real e
performance percebida
são muito importantes
sábado, 10 de setembro de 2011
Construir uma
aplicação performática
começa na construção
da sua API
sábado, 10 de setembro de 2011
Dicas de performance
de aplicações web
também funcinonam
aqui
Far future expires header, caching, conditional get, etags
mas o seu cliente deve suportar isso, como o
ASIHttpRequest
sábado, 10 de setembro de 2011
Se você usa um storage
restrito, não faça
redirect, faça proxying
Como S3 com signed URLs
sábado, 10 de setembro de 2011
Exemplo com S3
location ~* "^/s3_redirect/(.*)" {
resolver 8.8.8.8;	

internal;
proxy_max_temp_file_size 0;
proxy_set_header Authorization '';
# Download the file and send it to client
proxy_pass http://s3.amazonaws.com/$1?$args;
}
sábado, 10 de setembro de 2011
Evite usar formatos
binários
Thrift e Prococol buffer? Tô fora!
sábado, 10 de setembro de 2011
Prefira JSON a XML
como formato de
mensagens
E evolua a sua API com bem menos dores de cabeça
sábado, 10 de setembro de 2011
Procure enviar todos
os dados necessários
de cada chamada
{ activity : {
comment :“Objective-C is cool!”,
user : {
username :“cocoahead”,
profile_picture :“/images/cocoahead.jpeg” }
}
}
sábado, 10 de setembro de 2011
Dados relacionados,
como fotos, devem
sempre ter um
updated_at
{ artist : {
name : “John Doe”,
cover_image :“/images/artists/john_doe.jpeg”,
cover_updated_at :“2011-09-07T20:36:22Z”
}
}
sábado, 10 de setembro de 2011
Mantenha um cache
dos arquivos
relacionados
localmente
NSSearchPathForDirectoriesInDomains
( NSDocumentDirectory, NSUserDomainMask,YES );
sábado, 10 de setembro de 2011
Use SQLite pra gravar
os dados relacionados,
mas grave os arquivos
em disco
sábado, 10 de setembro de 2011
Crie uma Entity no
Core Data com os
atributos sourceType e
sourceId
sábado, 10 de setembro de 2011
Buscar imagens
NSDate * date = [ NSDate date ];
NSManagedObjectContext * context = self.managedObjectContext;
NSPredicate * predicate = [NSPredicate predicateWithFormat: @"( sourceId == %@ ) AND ( sourceType == %@ )", 1,
@"Album" ];
NSFetchRequest * request = [[ NSFetchRequest alloc ] init];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName: @"Image" inManagedObjectContext: context];
request.entity = entityDescription;
request.predicate = predicate;
NSError * error;
NSArray * images = [context executeFetchRequest: request error: &error ];
NSManagedObject * object = [images count] == 0 ? nil : [images objectAtIndex: 0];
NSDate * storedDate = [ object valueForKey: @"updatedAt" ];
if ( storedDate == nil || [storedDate compare: date ] == NSOrderedAscending) {
// download file here
} else {
// no need to download
}
[request release];
sábado, 10 de setembro de 2011
As redes são lentas e
não confiáveis
Double submit, alguém?
Y U NO
CONNECT TO SERVER?
sábado, 10 de setembro de 2011
Se falhar, guarde as
informações pra tentar
mais tarde
Mas avise ao usuário...
sábado, 10 de setembro de 2011
Não use alerts quando
não há soluçãosábado, 10 de setembro de 2011
Apenas mostre se
falhou ou não
sábado, 10 de setembro de 2011
Sempre abra a aplicação
com alguma informação
sábado, 10 de setembro de 2011
Trabalhos que
demoram muito tempo
pra serem executados?
NSOperationQueue and NSOperation to the rescue!
sábado, 10 de setembro de 2011
Criando o
FactorialOperation@implementation FactorialOperation
@synthesize source = _source, result = _result;
- (id) initWithSource:(NSInteger)source {
self = [ self init ];
if ( self ) {
self.source = source;
}
return self;
}
- (void) main {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
self.result = [ self factorialOf: self.source ];
[pool drain];
}
- (NSInteger) factorialOf: ( NSInteger ) value {
if ( value == 1) {
return 1;
} else {
return value * [self factorialOf: value - 1 ] ;
}
}
@end
sábado, 10 de setembro de 2011
Executando as
operações
NSOperationQueue * queue = [[ NSOperationQueue alloc ] init];
FactorialOperation * operationOne = [[ FactorialOperation alloc ] initWithSource: 5 ];
FactorialOperation * operationTwo = [[ FactorialOperation alloc ] initWithSource: 6 ];
[operationOne setQueuePriority: NSOperationQueuePriorityVeryHigh ];
[queue addOperation: operationOne ];
[queue addOperation: operationTwo ];
[operationOne release];
[operationTwo release];
while ( [queue operationCount] != 0 ) {
[NSThread sleepForTimeInterval: 1 ];
}
[ queue release ];
sábado, 10 de setembro de 2011
Por que não usar
NSThread diretamente?
Por que o seu código pode fazer uso do Grand Central
Dispatch se ele estiver disponível
sábado, 10 de setembro de 2011
Desenvolvimento de
jogos com Cocos2D e
Cocos3D
Mate a sua vontade de criar o próximo Angry Birds
sábado, 10 de setembro de 2011
Dúvidas?
sábado, 10 de setembro de 2011
Referências
• ASIHttpRequest - http://allseeing-i.com/
ASIHTTPRequest/
• PullToRefresh - https://github.com/leah/
PullToRefresh
• Cocos2D - http://cocos2d.org/
sábado, 10 de setembro de 2011

Weitere ähnliche Inhalte

Ähnlich wie IOS API

Introducao ao Desenvolvimento iOS
Introducao ao Desenvolvimento iOSIntroducao ao Desenvolvimento iOS
Introducao ao Desenvolvimento iOSDiogo Costa
 
Angular 2, TypeScript e Além
Angular 2, TypeScript e AlémAngular 2, TypeScript e Além
Angular 2, TypeScript e AlémAndre Baltieri
 
Introdução ao desenvolvimento para iOS
Introdução ao desenvolvimento para iOSIntrodução ao desenvolvimento para iOS
Introdução ao desenvolvimento para iOSAndrei Rosseti
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootRodrigo Cândido da Silva
 
Principais novidades do Entity Framework 5.0
Principais novidades do Entity Framework 5.0Principais novidades do Entity Framework 5.0
Principais novidades do Entity Framework 5.0Fernando Henrique
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftSemcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftJuliana Chahoud
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)Juliana Chahoud
 
Jenkins por dentro e por fora - Oracle Code São Paulo 2018
Jenkins por dentro e por fora - Oracle Code São Paulo 2018Jenkins por dentro e por fora - Oracle Code São Paulo 2018
Jenkins por dentro e por fora - Oracle Code São Paulo 2018Fernando Boaglio
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosphelypploch
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Servlets E Applet
Servlets E AppletServlets E Applet
Servlets E Appletasiramage
 

Ähnlich wie IOS API (20)

Desenvolvendo para iOS
Desenvolvendo para iOSDesenvolvendo para iOS
Desenvolvendo para iOS
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Introducao ao Desenvolvimento iOS
Introducao ao Desenvolvimento iOSIntroducao ao Desenvolvimento iOS
Introducao ao Desenvolvimento iOS
 
Angular 2, TypeScript e Além
Angular 2, TypeScript e AlémAngular 2, TypeScript e Além
Angular 2, TypeScript e Além
 
Introdução ao desenvolvimento para iOS
Introdução ao desenvolvimento para iOSIntrodução ao desenvolvimento para iOS
Introdução ao desenvolvimento para iOS
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring Boot
 
Palestra
PalestraPalestra
Palestra
 
Principais novidades do Entity Framework 5.0
Principais novidades do Entity Framework 5.0Principais novidades do Entity Framework 5.0
Principais novidades do Entity Framework 5.0
 
JavascriptCore
JavascriptCoreJavascriptCore
JavascriptCore
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftSemcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
 
Jenkins por dentro e por fora - Oracle Code São Paulo 2018
Jenkins por dentro e por fora - Oracle Code São Paulo 2018Jenkins por dentro e por fora - Oracle Code São Paulo 2018
Jenkins por dentro e por fora - Oracle Code São Paulo 2018
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
Servlets E Applet
Servlets E AppletServlets E Applet
Servlets E Applet
 

IOS API

  • 1. iOS,APIs, performance e sincronização de dados Maurício Linhares - @mauriciojr http://techbot.me/ sábado, 10 de setembro de 2011
  • 2. WHO? • GUJeiro de raiz - 01/2005 • Ruby, Objective-C, Java e Scala developer na http://officedrop.com/ • Nas horas vagas escreve no blog, grava screencasts e joga boardgames europeus; sábado, 10 de setembro de 2011
  • 3. Como entramos no mercado? • Aplicação pra iPad a época do lançamento do primeiro iPad; • Aplicação pra Mac á época do lançamento da Mac App Store; • Aplicação pra iPhone (recente); sábado, 10 de setembro de 2011
  • 4. Por que investir em iOS e Mac?sábado, 10 de setembro de 2011
  • 5. A vida é injusta sábado, 10 de setembro de 2011
  • 6. Build a Mac app? sábado, 10 de setembro de 2011
  • 7. Por investir em iOS e Mac? sábado, 10 de setembro de 2011
  • 8. Em números • Primeiros dois meses da aplicação pra iPad, 45% de crescimento em sign ups a cada mes; • Primeiros dois meses do ScanDrop for the Mac, 13% de crescimento; • Primeiros dois meses de aplicação pra Android, 14% de crescimento; • Primeiros dois meses de lançamento da aplicação pra iPhone, 51% de crescimento; sábado, 10 de setembro de 2011
  • 9. E tem mais? • A mídia americana (nosso mercado principal) adora Macs; • Todos os reviews das aplicações desktop pra Windows (temos duas) reclamavam da inexistência do Mac; • Se você tem versão pra Mac e iOS, as pessoas falam de você com mais facilidade; sábado, 10 de setembro de 2011
  • 10. Plataforma • Desenvolvimento usando XCode; • Em Objective-C, C e C++; • Ambiente de desenvolvimento exclusivo para o Mac (mas é possível compilar no Linux); sábado, 10 de setembro de 2011
  • 11. Objective-C é difícil? sábado, 10 de setembro de 2011
  • 12. Performance? sábado, 10 de setembro de 2011
  • 13. Performance real e performance percebida são muito importantes sábado, 10 de setembro de 2011
  • 14. Construir uma aplicação performática começa na construção da sua API sábado, 10 de setembro de 2011
  • 15. Dicas de performance de aplicações web também funcinonam aqui Far future expires header, caching, conditional get, etags mas o seu cliente deve suportar isso, como o ASIHttpRequest sábado, 10 de setembro de 2011
  • 16. Se você usa um storage restrito, não faça redirect, faça proxying Como S3 com signed URLs sábado, 10 de setembro de 2011
  • 17. Exemplo com S3 location ~* "^/s3_redirect/(.*)" { resolver 8.8.8.8; internal; proxy_max_temp_file_size 0; proxy_set_header Authorization ''; # Download the file and send it to client proxy_pass http://s3.amazonaws.com/$1?$args; } sábado, 10 de setembro de 2011
  • 18. Evite usar formatos binários Thrift e Prococol buffer? Tô fora! sábado, 10 de setembro de 2011
  • 19. Prefira JSON a XML como formato de mensagens E evolua a sua API com bem menos dores de cabeça sábado, 10 de setembro de 2011
  • 20. Procure enviar todos os dados necessários de cada chamada { activity : { comment :“Objective-C is cool!”, user : { username :“cocoahead”, profile_picture :“/images/cocoahead.jpeg” } } } sábado, 10 de setembro de 2011
  • 21. Dados relacionados, como fotos, devem sempre ter um updated_at { artist : { name : “John Doe”, cover_image :“/images/artists/john_doe.jpeg”, cover_updated_at :“2011-09-07T20:36:22Z” } } sábado, 10 de setembro de 2011
  • 22. Mantenha um cache dos arquivos relacionados localmente NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory, NSUserDomainMask,YES ); sábado, 10 de setembro de 2011
  • 23. Use SQLite pra gravar os dados relacionados, mas grave os arquivos em disco sábado, 10 de setembro de 2011
  • 24. Crie uma Entity no Core Data com os atributos sourceType e sourceId sábado, 10 de setembro de 2011
  • 25. Buscar imagens NSDate * date = [ NSDate date ]; NSManagedObjectContext * context = self.managedObjectContext; NSPredicate * predicate = [NSPredicate predicateWithFormat: @"( sourceId == %@ ) AND ( sourceType == %@ )", 1, @"Album" ]; NSFetchRequest * request = [[ NSFetchRequest alloc ] init]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName: @"Image" inManagedObjectContext: context]; request.entity = entityDescription; request.predicate = predicate; NSError * error; NSArray * images = [context executeFetchRequest: request error: &error ]; NSManagedObject * object = [images count] == 0 ? nil : [images objectAtIndex: 0]; NSDate * storedDate = [ object valueForKey: @"updatedAt" ]; if ( storedDate == nil || [storedDate compare: date ] == NSOrderedAscending) { // download file here } else { // no need to download } [request release]; sábado, 10 de setembro de 2011
  • 26. As redes são lentas e não confiáveis Double submit, alguém? Y U NO CONNECT TO SERVER? sábado, 10 de setembro de 2011
  • 27. Se falhar, guarde as informações pra tentar mais tarde Mas avise ao usuário... sábado, 10 de setembro de 2011
  • 28. Não use alerts quando não há soluçãosábado, 10 de setembro de 2011
  • 29. Apenas mostre se falhou ou não sábado, 10 de setembro de 2011
  • 30. Sempre abra a aplicação com alguma informação sábado, 10 de setembro de 2011
  • 31. Trabalhos que demoram muito tempo pra serem executados? NSOperationQueue and NSOperation to the rescue! sábado, 10 de setembro de 2011
  • 32. Criando o FactorialOperation@implementation FactorialOperation @synthesize source = _source, result = _result; - (id) initWithSource:(NSInteger)source { self = [ self init ]; if ( self ) { self.source = source; } return self; } - (void) main { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; self.result = [ self factorialOf: self.source ]; [pool drain]; } - (NSInteger) factorialOf: ( NSInteger ) value { if ( value == 1) { return 1; } else { return value * [self factorialOf: value - 1 ] ; } } @end sábado, 10 de setembro de 2011
  • 33. Executando as operações NSOperationQueue * queue = [[ NSOperationQueue alloc ] init]; FactorialOperation * operationOne = [[ FactorialOperation alloc ] initWithSource: 5 ]; FactorialOperation * operationTwo = [[ FactorialOperation alloc ] initWithSource: 6 ]; [operationOne setQueuePriority: NSOperationQueuePriorityVeryHigh ]; [queue addOperation: operationOne ]; [queue addOperation: operationTwo ]; [operationOne release]; [operationTwo release]; while ( [queue operationCount] != 0 ) { [NSThread sleepForTimeInterval: 1 ]; } [ queue release ]; sábado, 10 de setembro de 2011
  • 34. Por que não usar NSThread diretamente? Por que o seu código pode fazer uso do Grand Central Dispatch se ele estiver disponível sábado, 10 de setembro de 2011
  • 35. Desenvolvimento de jogos com Cocos2D e Cocos3D Mate a sua vontade de criar o próximo Angry Birds sábado, 10 de setembro de 2011
  • 36. Dúvidas? sábado, 10 de setembro de 2011
  • 37. Referências • ASIHttpRequest - http://allseeing-i.com/ ASIHTTPRequest/ • PullToRefresh - https://github.com/leah/ PullToRefresh • Cocos2D - http://cocos2d.org/ sábado, 10 de setembro de 2011