Quel est le but de l'utilisation de blocs

Je veux utiliser des blocs dans mon application, mais je ne sais vraiment rien sur les blocs. Quelqu'un peut-il expliquer comment et pourquoi je devrais utiliser des blocs dans mon code?

25
demandé sur Mick MacCallum 2012-08-29 15:33:22

3 réponses

Les blocs

Sont des fermetures (ou des fonctions lambda , comme vous voulez les appeler). Leur but est qu'en utilisant des blocs, le programmeur n'a pas besoin de créer des fonctions nommées dans la portée globale ou de fournir un rappel d'action cible, au lieu de cela, il peut créer une "fonction" locale sans nom qui peut accéder aux variables dans sa portée englobante et effectuer facilement des actions.

Par exemple, lorsque vous souhaitez par exemple répartir une opération asynchrone, une telle animation pour les vues, sans blocs, et vous vouliez être informé de la compétition, vous deviez écrire:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:context:)];
.... set up animation ....
[UIView commitAnimations];

C'est beaucoup de code, de plus cela implique la présence d'un pointeur self valide-qui pourrait ne pas toujours être disponible (j'éprouve une telle chose quand je développais MobileSubstrate-tweaks). Donc, au lieu de cela, vous pouvez utiliser des blocs à partir d'iOS 4.0 et suivants:

[UIView animateWithDuration:1.0 animations:^{
    // set up animation
} completion:^{
    // this will be executed on completion
}];

Ou, par exemple, charger des ressources en ligne avec NSURLConnection... B. B. (avant blocs):

urlConnection.delegate = self;

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)rsp
{
    // ...
}

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
    // ...
}

// and so on, there are 4 or 5 delegate methods...

A. B. (Anno Blocs):

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rsp, NSData *d, NSError *e) {
   // process request here
}];

Beaucoup plus facile, plus propre et plus courte.

30
répondu 2012-08-29 11:42:51

Citant un tutoriel Ray Wenderlich

Les blocs sont des fonctions de première classe, ce qui est une façon élégante de dire cela Les blocs sont régulièrement Objective-C objets. Comme ce sont des objets, ils peut être transmis en tant que paramètres, renvoyé à partir de méthodes et de fonctions, et attribué aux variables. Les blocs sont appelés fermetures dans d'autres langues tels que Python, Ruby et Lisp, car ils encapsulent l'état lorsque elles sont déclarées. Un bloc crée une copie const de toute variable locale cela est référencé à l'intérieur de sa portée. Avant les blocs, chaque fois que vous voulait appeler du code et de le rappeler plus tard, vous utilisez généralement delegates ou NSNotificationCenter. Qui a bien fonctionné, sauf qu'il répand votre code partout - vous démarrez une tâche en un seul endroit, et gérer le résultat dans un autre.

Par exemple, l'animation en vue à l'aide de blocs vous évite d'avoir à faire tout cela:

[UIView beginAnimations:@"myAnimation" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[myView setFrame:CGRectMake(30, 45, 43, 56)];
[UIView commitAnimations];

Pour seulement avoir à faire ceci:

[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    [myView setFrame:CGRectMake(54, 66, 88, 33)];
}completion:^(BOOL done){
    //
}];
14
répondu Mick MacCallum 2012-11-27 19:55:33

Une classe Objective-C définit un objet qui combine des données avec un comportement associé. Parfois, il est logique de représenter une seule tâche ou unité de comportement, plutôt qu'une collection de méthodes.

0
répondu Yugendhar Chintu 2015-06-13 19:19:28