• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
iOS, APIs e sincronização de dados
 

iOS, APIs e sincronização de dados

on

  • 1,921 views

Apresentaç˜

Apresentaç˜

Statistics

Views

Total Views
1,921
Views on SlideShare
1,916
Embed Views
5

Actions

Likes
1
Downloads
41
Comments
0

2 Embeds 5

http://twitter.com 3
https://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    iOS, APIs e sincronização de dados iOS, APIs e sincronização de dados Presentation Transcript

    • 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 é 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 importantessábado, 10 de setembro de 2011
    • Construir uma aplicação performática começa na construção da sua APIsá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 ASIHttpRequestsábado, 10 de setembro de 2011
    • Se você usa um storage restrito, não faça redirect, faça proxying Como S3 com signed URLssá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çasá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 discosábado, 10 de setembro de 2011
    • Crie uma Entity no Core Data com os atributos sourceType e sourceIdsá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
    • Y U NO CONNECT TO SERVER? As redes são lentas e não confiáveis Double submit, alguém?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ãosábado, 10 de setembro de 2011
    • Sempre abra a aplicação com alguma informaçãosá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 ] ; } } @endsá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ívelsábado, 10 de setembro de 2011
    • Desenvolvimento de jogos com Cocos2D e Cocos3D Mate a sua vontade de criar o próximo Angry Birdssá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