Skip to content
robsonximenes edited this page Jul 10, 2012 · 1 revision

Onde encontrar?

Todas as classes *ViewController trocam mensagens com as classes do pacote model.

Na maioria dos casos utilizamos a abordagem de passar a referência da classe e o método de callback a ser executado no final das operações assincronas. E na tela de LoginViewController utilizamos o recurso de notificação ( NSNotificationCenter);

Como funciona?

Utilizando o NSNotificationCenter

Esta forma isola bem as camadas, pois é baseada no registro de listeners.

O exemplo de login esclarecerá o uso deste mecanismo.

Durante o evento viewDidLoad da classe LoginViewController o seguinte método foi invocado:

/* Registra todos os observadores desta classe */
-(void) configureTheListeners{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidLoggedIn:) name:EVENT_LOGIN_OK object:nil];    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidLoggedWithError:) name:EVENT_LOGIN_FAIL object:nil];
}

Percebam que registri 2 observadores, um para o caso de sucesso no login e outro para o caso de falha. Agora sempre que alguma classe no projeto levantar uma notificação com um destes 2 eventos, esta classe será invocada para trata-los;

Vou colocar aqui o método userDidLoggedIn que precisa receber um parâmetro NSNotification:

- (void) userDidLoggedIn: (NSNotification *) notification{
    NSLog(@"Usuario logado: %@", [(User *)notification.object email]);
    RankingViewController *ranking = [[RankingViewController alloc] init];
    [buttonLogin setEnabled:YES];
    [self presentModalViewController:ranking animated:YES];
}

Vejam como eu pego o objeto dentro da notificação.

Então vamos ver como na classe User.m enviamos a notificação passando o objeto User como retorno.

-(void) didLoginWithXML: (NSString *) xml{
    /*Trecho omitido para fins didaticos */
    NSLog(@"Sending event: %@", EVENT_LOGIN_OK);
    [[NSNotificationCenter defaultCenter] postNotificationName: EVENT_LOGIN_OK object:self];
}

O parametro foi informado como self, que é a instancia de User.