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
?
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.
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..");
}];
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.
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.
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).
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