iOS, APIs e sincronização de dados
-
Upload
mauricio-linhares -
Category
Technology
-
view
1.690 -
download
0
description
Transcript of iOS, APIs e sincronização de dados
![Page 1: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/1.jpg)
iOS, APIs, performance e sincronização de
dadosMaurício Linhares - @mauriciojr
http://techbot.me/
sábado, 10 de setembro de 2011
![Page 2: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/2.jpg)
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
![Page 3: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/3.jpg)
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
![Page 4: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/4.jpg)
Por que investir em iOS e Mac?
sábado, 10 de setembro de 2011
![Page 5: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/5.jpg)
A vida é injustasábado, 10 de setembro de 2011
![Page 6: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/6.jpg)
Build a Mac app?
sábado, 10 de setembro de 2011
![Page 7: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/7.jpg)
Por investir em iOS e Mac?
sábado, 10 de setembro de 2011
![Page 8: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/8.jpg)
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
![Page 9: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/9.jpg)
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
![Page 10: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/10.jpg)
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
![Page 11: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/11.jpg)
Objective-C é difícil?sábado, 10 de setembro de 2011
![Page 12: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/12.jpg)
Performance?sábado, 10 de setembro de 2011
![Page 13: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/13.jpg)
Performance real e performance percebida são muito importantes
sábado, 10 de setembro de 2011
![Page 14: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/14.jpg)
Construir uma aplicação performática começa na construção
da sua API
sábado, 10 de setembro de 2011
![Page 15: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/15.jpg)
Dicas de performance de aplicações web
também funcinonam aqui
Far future expires header, caching, conditional get, etagsmas o seu cliente deve suportar isso, como o
ASIHttpRequest
sábado, 10 de setembro de 2011
![Page 16: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/16.jpg)
Se você usa um storage restrito, não faça
redirect, faça proxyingComo S3 com signed URLs
sábado, 10 de setembro de 2011
![Page 17: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/17.jpg)
Exemplo com S3location ~* "^/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
![Page 18: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/18.jpg)
Evite usar formatos binários
Thrift e Prococol buffer? Tô fora!
sábado, 10 de setembro de 2011
![Page 19: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/19.jpg)
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
![Page 20: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/20.jpg)
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
![Page 21: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/21.jpg)
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
![Page 22: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/22.jpg)
Mantenha um cache dos arquivos relacionados localmente
NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
sábado, 10 de setembro de 2011
![Page 23: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/23.jpg)
Use SQLite pra gravar os dados relacionados, mas grave os arquivos
em disco
sábado, 10 de setembro de 2011
![Page 24: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/24.jpg)
Crie uma Entity no Core Data com os
atributos sourceType e sourceId
sábado, 10 de setembro de 2011
![Page 25: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/25.jpg)
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
![Page 26: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/26.jpg)
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
![Page 27: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/27.jpg)
Se falhar, guarde as informações pra tentar
mais tarde
Mas avise ao usuário...
sábado, 10 de setembro de 2011
![Page 28: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/28.jpg)
Não use alerts quando não há solução
sábado, 10 de setembro de 2011
![Page 29: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/29.jpg)
Apenas mostre se falhou ou não
sábado, 10 de setembro de 2011
![Page 30: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/30.jpg)
Sempre abra a aplicação com alguma informação
sábado, 10 de setembro de 2011
![Page 31: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/31.jpg)
Trabalhos que demoram muito tempo pra serem executados?NSOperationQueue and NSOperation to the rescue!
sábado, 10 de setembro de 2011
![Page 32: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/32.jpg)
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
![Page 33: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/33.jpg)
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
![Page 34: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/34.jpg)
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
![Page 35: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/35.jpg)
Desenvolvimento de jogos com Cocos2D e
Cocos3DMate a sua vontade de criar o próximo Angry Birds
sábado, 10 de setembro de 2011
![Page 36: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/36.jpg)
Dúvidas?
sábado, 10 de setembro de 2011
![Page 37: iOS, APIs e sincronização de dados](https://reader038.fdocuments.net/reader038/viewer/2022110115/548e1904b47959db028b4770/html5/thumbnails/37.jpg)
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