web-dev-qa-db-fra.com

Différence entre le gestionnaire d'achèvement et les blocs: [iOS]

Je suis gêné par le gestionnaire de complétion et les blocs pendant que je les utilise dans Swift et Objective-C. Et quand je recherche des blocs dans Swift sur google, cela montre le résultat pour le gestionnaire d'achèvement! Quelqu'un peut-il me dire quelle est la différence entre le gestionnaire de complétion et les blocs par rapport à Swift et Objective-C?

22
shubham mishra

Ici, vous pouvez facilement différencier les blocs et les gestionnaires de complétion. En fait, les deux sont des blocs, voir détail ci-dessous.

Blocs:

Les blocs sont une fonctionnalité au niveau du langage ajoutée à C, Objective-C et C++, qui vous permettent de créer des segments de code distincts qui peuvent être transmis aux méthodes ou aux fonctions comme s'il s'agissait de valeurs. Les blocs sont des objets Objective-C, ce qui signifie qu'ils peuvent être ajoutés à des collections comme NSArray ou NSDictionary.

  • Ils peuvent être exécutés ultérieurement, et non lors de l'exécution du code de l'étendue qu'ils ont été implémentés.
  • Leur utilisation conduit finalement à une écriture de code beaucoup plus propre et plus ordonnée, car elles peuvent être utilisées à la place des méthodes déléguées, écrites en un seul endroit et non réparties sur de nombreux fichiers.

Syntaxe: ReturnType (^ blockName) (Paramètres) voir l'exemple :

int anInteger = 42;

void (^testBlock)(void) = ^{

    NSLog(@"Integer is: %i", anInteger);   // anInteger outside variables

};

// calling blocks like
testBlock();

Bloc avec argument:

double (^multiplyTwoValues)(double, double) =

                          ^(double firstValue, double secondValue) {

                              return firstValue * secondValue;

                          };
// calling with parameter
double result = multiplyTwoValues(2,4);

NSLog(@"The result is %f", result);

Gestionnaire de complétion:

Alors que le gestionnaire d'achèvement est un moyen (technique) d'implémentation de la fonctionnalité de rappel à l'aide de blocs.

Un gestionnaire d'achèvement n'est rien de plus qu'une simple déclaration de bloc passée en paramètre à une méthode qui doit effectuer un rappel ultérieurement.

Remarque: le gestionnaire d'achèvement doit toujours être le dernier paramètre d'une méthode. Une méthode peut avoir autant d'arguments que vous le souhaitez, mais toujours le gestionnaire d'achèvement comme dernier argument de la liste des paramètres.

Exemple:

- (void)beginTaskWithName:(NSString *)name completion:(void(^)(void))callback;

// calling
[self beginTaskWithName:@"MyTask" completion:^{

    NSLog(@"Task completed ..");

}];

Plus d'exemples avec les méthodes de classes UIKit.

[self presentViewController:viewController animated:YES completion:^{
        NSLog(@"xyz View Controller presented ..");

        // Other code related to view controller presentation...
    }];

[UIView animateWithDuration:0.5
                     animations:^{
                         // Animation-related code here...
                         [self.view setAlpha:0.5];
                     }
                     completion:^(BOOL finished) {
                         // Any completion handler related code here...

                         NSLog(@"Animation over..");
                     }];
31
vaibhav

Blocs : Obj-c

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;

[object hardProcessingWithString:@"commands" withCompletion:^(NSString *result){
    NSLog(result);
}];

Fermetures : Swift

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {
    ...
    completion("we finished!")
}

La fermeture d'achèvement ici par exemple n'est qu'une fonction qui prend la chaîne d'argument et renvoie void.

Les fermetures sont des blocs de fonctionnalités autonomes qui peuvent être transmis et utilisés dans votre code. Les fermetures dans Swift sont similaires aux blocs en C et Objective-C et aux lambdas dans d'autres langages de programmation.

https://developer.Apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Les fermetures sont des objets de première classe, de sorte qu'ils peuvent être imbriqués et transmis (comme le font les blocs dans Objective-C). Dans Swift, les fonctions ne sont qu'un cas particulier de fermetures.

7
pedrouan

En bref: les gestionnaires d'achèvement sont un moyen d'implémenter la fonctionnalité de rappel à l'aide de blocs ou de fermetures. Les blocs et les fermetures sont des morceaux de code qui peuvent être transmis aux méthodes ou aux fonctions comme s'il s'agissait de valeurs (en d'autres termes, des "fonctions anonymes" auxquelles nous pouvons donner des noms et les transmettre).

7
Axel Guilmin

J'espère que cela vous aidera.

Premier pas:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


-(void)InsertUser:(NSString*)userName InsertUserLastName:(NSString*)lastName  widthCompletion:(void(^)(NSString* result))callback;

@end

Deuxième étape :

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)InsertUser:(NSString *)userName InsertUserLastName:(NSString*)lastName widthCompletion:(void (^)(NSString* result))callback{

    callback(@"User inserted successfully");

}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self InsertUser:@"Ded" InsertUserLastName:@"Moroz" widthCompletion:^(NSString *result) {

        NSLog(@"Result:%@",result);

    }];

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
3
Kirill Shur