ios, apis e sincronização de dados

Post on 15-Dec-2014

1.690 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Apresentaç˜

TRANSCRIPT

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

top related