Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

74
Conceitos e prática no desenvolvimento iOS

description

Slides da minha palestra na Mobile Conf 2014.

Transcript of Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Page 1: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Conceitos e prática no desenvolvimento iOS

Page 2: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Desenvolvedor e instrutor (iOS, Android, Java e Ruby)

Quem sou eu?

@fabiopimentelgithub.com/fabiopimentel

Page 3: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Vamos programar?

Objective-C (OFICIAL)

Ruby - RubyMotion

C# - Xamarin

Page 4: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

iOS MVC

Controller

Model View

Page 5: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

iOS MVC

Controller

Model View

------

------

-----

------

-----

Page 6: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

iOS MVC

Controller

Model View

------

------

-----

------

-----

Page 7: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

iOS MVC

Controller

Model View

------

------

-----

------

-----

Outlet

Page 8: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

iOS MVC

Controller

Model View

------

------

-----

------

-----

Outlet

Action

Page 9: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opções para View

Page 10: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

StoryBoard

Page 11: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Xib

Page 12: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opções para View

1) StoryBoard2) Xib2) Programaticamente

Page 13: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Ciclo de Vida

Page 14: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

ViewController

A tela já existe?

Page 15: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

ViewController

A tela já existe?

viewWillAppear

Não

viewDidAppear

Tela visível

viewDidLoadFluxo

Page 16: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

ViewController

A tela já existe?

Sim

viewWillAppear

Não

viewDidAppear

Tela visível

viewDidLoad

Page 17: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

viewDidLoad

viewWillAppear

Tela visível

viewWillDisappear

Ciclo de vida - ViewController

viewDidAppear

viewDidDisappear

Tela não visível

Page 18: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Ciclo de Vida - App

Aplicação não está rodando

Usuário clica no ícone

da appapplication:didFinishLauchingWithOptions:

applicationDidBecomeActive:

Aplicação rodando

Usuário clica em Home, ou recebe

chamada telefônica/SMS

applicationWillResignActive:

applicationDidEnterBackground:

Aplicação em backgroung

Usuário clica no ícone

da appapplicationWillEnterForeground:

Page 19: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Ciclo de Vida - App

Aplicação não está rodando

Usuário clica no ícone

da appapplication:didFinishLauchingWithOptions:

applicationDidBecomeActive:

Aplicação rodando

Usuário clica em Home, ou recebe

chamada telefônica/SMS

applicationWillResignActive:

applicationDidEnterBackground:

Aplicação em backgroung

Usuário clica no ícone

da appapplicationWillEnterForeground:

Page 20: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Live Coding

First

Roun

d

Page 21: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Principal componente do iOS

Page 22: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

TableViewhttps://developer.apple.com/library/ios/documentation/userexperience/conceptual/tableview_iphone/

AboutTableViewsiPhone/AboutTableViewsiPhone.html

Page 23: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

UITableViewStyleGrouped

Page 24: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

UITableViewStylePlain

Page 25: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Section 0

Section 1

Section 2

Section 3

Section 4

Page 26: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Row 0

Row 1

Page 27: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Row 0

Row 1

Row 2

Page 28: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

NSIndexPath"The UIKit framework adds programming interfaces to the NSIndexPath class of the

Foundation framework to facilitate the identification of rows and sections in UITableView objects and the identification of items and sections in UICollectionView

objects."

https://developer.apple.com/library/ios/documentation/uikit/reference/NSIndexPath_UIKitAdditions/Reference/Reference.html

Page 29: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

NSIndexPath

Row Section

Page 30: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Row 2

Section 2

NSIndexPath

Page 31: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

UITableViewControllerhttps://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewController_Class/

Reference/Reference.html

Page 32: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Métodos para configuração

– numberOfSectionsInTableView:

- tableView:numberOfRowsInSection:

– tableView:cellForRowAtIndexPath:

Page 33: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Trabalhando em Background

Page 34: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opção 1

performSelectorInBackground:withObject:

performSelectonOnMainThread:withObject:waitUntilDone

Page 35: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo

-(IBAction)carregaLista:(UIButton *) botao !

{! [self performSelectorInBackground: @selector(buscaMotos) withObject: nil];!}

Page 36: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo

-(IBAction)carregaLista:(UIButton *) botao !

{! [self performSelectorInBackground: @selector(buscaMotos) withObject: nil];!

} -(void)buscaMotos!

{

//faz a comunicação com algum webservice

[self performSelectorOnMainThread @selector(atualizaTabela:) withObject: arrayDeDados waitUntilDone: NO];!

}

Page 37: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo-(IBAction)carregaLista:(UIButton *) botao !

{! [self performSelectorInBackground: @selector(buscaMotos) withObject: nil];!

} -(void)buscaMotos!

{

//faz a comunicação com algum webservice

[self performSelectorOnMainThread @selector(atualizaTabela:) withObject: nil waitUntilDone: NO];!

}!

-(void)atualizaTabela:(NSObject*) object!

{

! ! [self.tableView reloadData];!

}

Page 38: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opção 2

NSOperationQueue

NSInvocationOperation ou NSBlockOperation

Page 39: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo-(IBAction)carregaLista:(UIButton *) botao { NSOperationQueue * queue = [[NSOperationQueue alloc]init]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(downloadMotos) object:nil]; ! [queue addOperation:operation]; } !-(void)downloadPosts{ //faz a comunicação com algum webservice! [self performSelectorOnMainThread @selector(atualizaTabela:) withObject: arrayDeDados waitUntilDone: NO]; !} !-(void)atualizaTabela:(NSObject*) object{ //... [self.tableView reloadData]; }

Page 40: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opção 3

Grand Central Dispatch (GCD)

Page 41: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

ExemploNSArray *images = @[@"http://example.com/image1.png", @"http://example.com/image2.png", @"http://example.com/image3.png", @"http://example.com/image4.png"]; !dispatch_queue_t imageQueue = dispatch_queue_create("Image Queue",NULL); !for (NSString *urlString in images) { dispatch_async(imageQueue, ^{ NSURL *url = [NSURL URLWithString:urlString]; NSData *imageData = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:imageData]; ! NSUInteger imageIndex = [images indexOfObject:urlString]; UIImageView *imageVIew = (UIImageView *)[self.view viewWithTag:imageIndex]; if (!imageView) return; dispatch_async(dispatch_get_main_queue(), ^{ // Update the UI [imageVIew setImage:image]; }); }); }

Page 42: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Conexão com webservices

Page 43: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opção 1

NSURLRequest e NSURLMutableRequest

NSURLConnection

Page 44: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo(GET)NSString * url = @“http://projetows.heroku.com/motos.json” !NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString: url] ]; ![NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler: ^(NSURLResponse *response, NSData *data, NSError *connectionError) { // manipula resposta } ];

Page 45: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opção 2

!

NSURLSession (iOS 7)

Page 46: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo (GET)NSString * url = @“http://projetows.heroku.com/motos.json” !NSURLSession *session = [NSURLSession sharedSession];

[session dataTaskWithURL: [NSURL URLWithString: url]completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)

{

//manipula resposta!

}

] resume];

Page 47: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Interpretando resultados

Page 48: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

JSONprojetows.heroku.com/motos.json

[ { "marca":"Yamaha", "modelo":"R1", }, { "marca":"Honda", “modelo":"CBR 600 RR", } ]

Page 49: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opção da Apple

NSJSONSerializationhttps://developer.apple.com/library/ios/documentation/ foundation/reference/nsjsonserialization_class

Page 50: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

ExemploNSString *url = @“http://projetows.heroku.com/motos.json";!!NSData *jsonData = [NSData dataWithContentsOfURL: [NSURL URLWithString:url]];!!NSError *error;!NSArray *resultados = [NSJSONSerialization JSONObjectWithData: jsonData options:NSJSONReadingMutableContainers error:&error];!if(!error) {!! for(NSDictionary * moto in resultados){!! ! NSString *marca = [moto objectForKey:@"marca"];! ! ! NSString *modelo = [moto objectForKey:@"modelo"];! ! ! NSLog(@"Marca: %@, modelo: %@", marca, modelo);!! }!}!

Page 51: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Opções de terceiros

https://github.com/stig/json-framework/JSON Framework

https://github.com/TouchCode/TouchJSONTouchJSON

Page 52: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Agora basta juntar tudo?

Page 53: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

https://github.com/AFNetworking/AFNetworking

Page 54: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Exemplo!NSString * url = @“projetows.heroku.com/motos.json”!AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];!![manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {!! !! self.json = responseObject;! ! for(NSDictionary * moto in self.json){! ! ! NSString *marca = [moto objectForKey:@"marca"];! ! ! NSString *modelo = [moto objectForKey:@"modelo"];! ! ! NSLog(@"Marca: %@, modelo: %@", marca, modelo);! ! }! } failure:^(AFHTTPRequestOperation *operation, NSError *error) {! NSLog(@"Error: %@", error);! ! }];!}!

Page 55: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Como usá-lo no projeto?

Page 56: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

CocoaPodshttp://cocoapods.org/

Gerenciador de

dependências

Page 57: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Instalação

gem install cocoapods

Page 58: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Instalação

gem install cocoa-pods

Podfile

Page 59: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Podfile

platform :ios , '7.1'!!

pod 'AFNetworking', '> 2.0'

Page 60: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Instalaçãogem install cocoa-pods

Podfile

pod install

Page 61: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Saída(Terminal)Fabios-MacBook-Pro:MobileConf fabiopimentel$ pod install Analyzing dependencies Downloading dependencies Installing AFNetworking (2.2.4) Generating Pods project Integrating client project ![!] From now on use `MobileConf.xcworkspace`.

Page 62: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Estrutura do projeto

Page 63: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Live Coding

Second

Round

Page 64: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Mais bibliotecas …

Page 65: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

TestesKiwi

https://github.com/kiwi-bdd/KiwiBDD

style

describe(@"Team", ^{ context(@"when newly created", ^{ it(@"should have a name", ^{ id team = [Team team]; [[team.name should] equal:@"Black Hawks"]; }); ! it(@"should have 11 players", ^{ id team = [Team team]; [[[team should] have:11] players]; }); }); });

Page 66: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Testes

KIFhttps://github.com/kif-framework/KIF

Acceptance Tests

Kiwihttps://github.com/kiwi-bdd/Kiwi

BDD style

Page 67: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

KIF Acceptance Tests@implementation LoginTests !- (void)beforeEach { [tester navigateToLoginPage]; } !- (void)afterEach { [tester returnToLoggedOutHomeScreen]; } !- (void)testSuccessfulLogin { [tester enterText:@"[email protected]" intoViewWithAccessibilityLabel:@"Login User Name"]; [tester enterText:@"thisismypassword" intoViewWithAccessibilityLabel:@"Login Password"]; [tester tapViewWithAccessibilityLabel:@"Log In"]; ! // Verify that the login succeeded [tester waitForTappableViewWithAccessibilityLabel:@"Welcome"]; } !@end

Page 68: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Ainda mais…

Page 69: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

https://www.testflightapp.com/

Page 70: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

AppCode (IDE)

Page 71: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

E agora?

Page 72: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

http://www.caelum.com.br/curso-ios-iphone-ipad/

Page 73: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

https://developer.apple.com/programs/ios/

Page 74: Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014

Obrigado!@fabiopimentel