wake-up-neo.com

Unterschied zwischen Completion Handler und Blöcken: [iOS]

Während ich sie in Swift und Objective-C Verwende, bin ich mit dem Completion Handler und den Blöcken durcheinander. Und wenn ich in Swift auf google nach Blöcken suche, wird das Ergebnis für den Completion Handler angezeigt! Kann mir jemand sagen, was der Unterschied zwischen Completion Handler und Blöcken in Bezug auf Swift und Objective-C Ist?

22
shubham mishra

Hier können Sie leicht zwischen Blöcken und Completion-Handlern unterscheiden. Beide sind Blöcke, siehe Detail unten.

Blöcke:

Blöcke sind ein Feature auf Sprachebene, das zu C, Objective-C und C++ hinzugefügt wurde. Mit ihnen können Sie unterschiedliche Codesegmente erstellen, die an Methoden oder Funktionen übergeben werden können, als wären sie Werte. Blöcke sind Objective-C-Objekte, dh sie können Sammlungen wie NSArray oder NSDictionary hinzugefügt werden.

  • Sie können zu einem späteren Zeitpunkt ausgeführt werden und nicht, wenn der Code des Bereichs, in dem sie implementiert wurden, ausgeführt wird.
  • Ihre Verwendung führt schließlich zu einem saubereren und übersichtlicheren Schreiben von Code, da sie anstelle von Delegierungsmethoden verwendet werden können, nur an einer Stelle geschrieben und nicht auf viele Dateien verteilt werden.

Syntax: ReturnType (^ blockName) (Parameter) siehe Beispiel :

int anInteger = 42;

void (^testBlock)(void) = ^{

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

};

// calling blocks like
testBlock();

Block mit 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);

Completion-Handler:

Der Completion-Handler ist eine Methode (Technik) zum Implementieren der Callback-Funktionalität mithilfe von Blöcken.

Ein Completion-Handler ist nichts anderes als eine einfache Blockdeklaration, die als Parameter an eine Methode übergeben wird, die zu einem späteren Zeitpunkt einen Rückruf durchführen muss.

Hinweis: Der Beendigungshandler sollte immer der letzte Parameter in einer Methode sein. Eine Methode kann beliebig viele Argumente enthalten, der Beendigungshandler muss jedoch immer das letzte Argument in der Parameterliste sein.

Beispiel:

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

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

    NSLog(@"Task completed ..");

}];

Mehr Beispiel mit UIKit Klassenmethoden.

[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

Blöcke : Obj-c

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

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

Verschlüsse : Swift

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

Der Abschluss hier ist beispielsweise nur eine Funktion, die eine Argumentzeichenfolge akzeptiert und void zurückgibt.

Verschlüsse sind in sich geschlossene Funktionsblöcke, die weitergegeben und in Ihrem Code verwendet werden können. Closures in Swift sind ähnlich wie Blocks in C und Objective-C und Lambdas in anderen Programmiersprachen.

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

Closures sind erstklassige Objekte, sodass sie verschachtelt und weitergegeben werden können (wie auch Blöcke in Objective-C). Funktionen sind in Swift nur ein Sonderfall von Verschlüssen.

7
pedrouan

Kurz gesagt: Completion-Handler sind eine Möglichkeit, Callback-Funktionen mithilfe von Blöcken oder Closures zu implementieren. Blöcke und Closures sind Codestücke, die an Methoden oder Funktionen weitergegeben werden können, als wären sie Werte (mit anderen Worten "anonyme Funktionen", denen wir Namen geben und die wir weitergeben können).

7
Axel Guilmin

Ich hoffe das wird helfen.

Erster Schritt:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


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

@end

Zweiter Schritt :

#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