[XCode] Avantage du développement de blocks de sortie (completion)

jeudi 10 mars 2016

Vous avez du souvent dû utiliser en Objective-C des fonctions asynschrone qui utilise des fonctions avec des blocks de sortie. Il y en a notamment un certain nombre par exemple avec le pods RestKit très utile pour gérer les requêtes asynchrones pour l’interrogation de Webservice par exemple.

Mais dans cet article, je vais vous présenter le grand avantage de travailler avec des blocks. En effet, il peut être très pratique d’utiliser des blocks pour créer des segments de code dans une vue et pouvoir faire appel facilement dans une autre! Ce qui par exemple permet de mettre à jour une vue alors qu’on se trouve sur une autre vue! En effet, le fait de créer un block permet de pouvoir l’utiliser comme un objet par après d’ou la puissance des blocks.

Un bloc est simultanément un groupe d’instructions et un objet. Un bloc ressemble à une fonction C, mais il doit être définit dans une méthode. Une fois cela fait, vous pouvez faire pointer une variable sur le bloc comme sur un objet. Et donc grâce à cette variable, vous pouvez transmettre un pointeur sur un bloc de code en tant qu’argument à une méthode ou le mémoriser dans une variable d’instance.

Voici un exemple qui permet de bien comprendre l’intérêt des blocks.

Prenons l’exemple d’une TableViewController A et d’une vue détail B d’un élément sélectionné dans la tableView.

Dans la DetailView B:

@property (nonatomic,copy) void (^dismissBlock)(void);
@synthesize dismissBlock;

Dans cette vue, imaginons qu’il est possible de modifier le titre de l’élément qui est affiché aussi dans la tableView A. Dans la méthode qui valide le changement du titre et qui ferme la page de détail pour retourner vers la tableView, on ajoute ceci:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:dismissBlock]

Maintenant, on aimerait recharger la page TableView qui présente tous les titres via la fonction relaodData. cette méthode est évidement uniquement accessible depuis la vue TableView. Donc on va assigner du code dans le block dans la vue TableView.

[detailViewController setDismissBlock:^{
   [[self tableView] reloadData];
}];

Voilà, la puissance des blocks permet de créer des portions de code dans une vue ou on a tous ces composants dont on a besoin d’interagir et de juste passer ce bloks vers une autre vue pour pouvoir faire interagir ces composants sans devoir par exemple passer chaque composant ou la vue de ViewController en ViewController.

Tags: blocks