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
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çã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
                          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, APIs e sincronização de dados

Dominando o Ionic Framework
Dominando o Ionic FrameworkDominando o Ionic Framework
Dominando o Ionic FrameworkJunior Abranches
 
Persistência com Realm para Android e iOS
Persistência com Realm para Android e iOSPersistência com Realm para Android e iOS
Persistência com Realm para Android e iOStdc-globalcode
 
TDC 2010: Desenvolvimento para iPhone
TDC 2010: Desenvolvimento para iPhoneTDC 2010: Desenvolvimento para iPhone
TDC 2010: Desenvolvimento para iPhoneHelder da Rocha
 
Silverlight 4 e Expression Blend 4
Silverlight 4 e Expression Blend 4Silverlight 4 e Expression Blend 4
Silverlight 4 e Expression Blend 4Rodrigo Kono
 
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
 
TDC 2011 - E no sétimo dia ele escreveu testes
TDC 2011 - E no sétimo dia ele escreveu testesTDC 2011 - E no sétimo dia ele escreveu testes
TDC 2011 - E no sétimo dia ele escreveu testesRafael Dohms
 
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
 
DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2
DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2 DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2
DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2 Vic Fernandes
 
Construindo aplicações ricas com Silverlight
Construindo aplicações ricas com SilverlightConstruindo aplicações ricas com Silverlight
Construindo aplicações ricas com SilverlightFelipe Pocchini
 
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...Marcelo Marques Gonçalves
 
Ionic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APPIonic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APPFabio Godoy
 
Introdução ao silverlight
Introdução ao silverlightIntrodução ao silverlight
Introdução ao silverlightFelipe Pocchini
 
TDC 2011 - Open a Window, see the clouds
TDC 2011 - Open a Window, see the cloudsTDC 2011 - Open a Window, see the clouds
TDC 2011 - Open a Window, see the cloudsRafael Dohms
 
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveisSeminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveisRogério Moraes de Carvalho
 
TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...tdc-globalcode
 

Ähnlich wie iOS, APIs e sincronização de dados (20)

Dominando o Ionic Framework
Dominando o Ionic FrameworkDominando o Ionic Framework
Dominando o Ionic Framework
 
Persistência com Realm para Android e iOS
Persistência com Realm para Android e iOSPersistência com Realm para Android e iOS
Persistência com Realm para Android e iOS
 
Realm
RealmRealm
Realm
 
TDC 2010: Desenvolvimento para iPhone
TDC 2010: Desenvolvimento para iPhoneTDC 2010: Desenvolvimento para iPhone
TDC 2010: Desenvolvimento para iPhone
 
Worklight exemplo
Worklight exemploWorklight exemplo
Worklight exemplo
 
Silverlight 4 e Expression Blend 4
Silverlight 4 e Expression Blend 4Silverlight 4 e Expression Blend 4
Silverlight 4 e Expression Blend 4
 
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
 
TDC 2011 - E no sétimo dia ele escreveu testes
TDC 2011 - E no sétimo dia ele escreveu testesTDC 2011 - E no sétimo dia ele escreveu testes
TDC 2011 - E no sétimo dia ele escreveu testes
 
Curso Básico Android - Aula 01
Curso Básico Android - Aula 01Curso Básico Android - Aula 01
Curso Básico Android - Aula 01
 
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
 
Seu site voando
Seu site voandoSeu site voando
Seu site voando
 
DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2
DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2 DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2
DC2012 - First steps with Firemonkey and iOS apps in Delphi XE2
 
Framework 7 pdf
Framework 7 pdfFramework 7 pdf
Framework 7 pdf
 
Construindo aplicações ricas com Silverlight
Construindo aplicações ricas com SilverlightConstruindo aplicações ricas com Silverlight
Construindo aplicações ricas com Silverlight
 
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
 
Ionic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APPIonic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APP
 
Introdução ao silverlight
Introdução ao silverlightIntrodução ao silverlight
Introdução ao silverlight
 
TDC 2011 - Open a Window, see the clouds
TDC 2011 - Open a Window, see the cloudsTDC 2011 - Open a Window, see the clouds
TDC 2011 - Open a Window, see the clouds
 
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveisSeminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
 
TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...
TDC2017 | São Paulo - Trilha Mobile How we figured out we had a SRE team at -...
 

Mehr von Maurício Linhares

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropMaurício Linhares
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemMaurício Linhares
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 

Mehr von Maurício Linhares (20)

Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Curso java 02 - variáveis
Curso java   02 - variáveisCurso java   02 - variáveis
Curso java 02 - variáveis
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Feature Driven Development
Feature Driven DevelopmentFeature Driven Development
Feature Driven Development
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvem
 
Mercado hoje
Mercado hojeMercado hoje
Mercado hoje
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Revisão html e java script
Revisão html e java scriptRevisão html e java script
Revisão html e java script
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 

iOS, APIs e sincronização de dados

  • 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. 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
  • 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ção sá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