View
1.690
Download
0
Category
Preview:
DESCRIPTION
Apresentaç˜
Citation preview
iOS, APIs, performance e sincronização de
dadosMaurí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 é injustasá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, etagsmas 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 proxyingComo S3 com signed URLs
sábado, 10 de setembro de 2011
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
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ção
sá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
Cocos3DMate 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
Recommended