Diferencia entre manejador de finalización y bloques:

Estoy desorderado tanto con el manejador de finalización como con los bloques mientras los uso en swift y objective-c. ¡Y cuando estoy buscando bloques en swift en google está mostrando resultados para el manejador de finalización! ¿Alguien puede decirme cuál es la diferencia entre manejador de finalización y bloques con respecto a swift y objective-c?

Aquí puede diferenciar fácilmente entre bloques y manejadores de finalización, de hecho, ambos son bloques, vea el detalle a continuación.

Bloques:

Los bloques son una característica de nivel de idioma agregada a C, Objective-C y C ++, que le permiten crear segmentos de código distintos que pueden pasarse a methods o funciones como si fueran valores. Los bloques son objects Objective-C, lo que significa que pueden agregarse a collections como NSArray o NSDictionary.

  • Pueden ejecutarse en un momento posterior, y no cuando se esté ejecutando el código del scope en que se implementaron.
  • Su uso conduce finalmente a una escritura de código mucho más limpia y orderada, ya que pueden usarse en lugar de methods de delegates, escritos solo en un lugar y no distribuidos en muchos files.

Sintaxis: ReturnType (^ blockName) (Parámetros) ver ejemplo :

int anInteger = 42; void (^testBlock)(void) = ^{ NSLog(@"Integer is: %i", anInteger); // anInteger outside variables }; // calling blocks like testBlock(); 

Bloque con argumento:

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

Gestor de finalización:

Mientras que el manejador de finalización es una forma (técnica) de implementar la funcionalidad de callback utilizando bloques.

Un manejador de finalización no es más que una statement de bloque simple que se pasa como un parámetro a un método que necesita hacer una callback en un momento posterior.

Nota: el manejador de finalización siempre debe ser el último parámetro de un método. Un método puede tener tantos arguments como desee, pero siempre tiene el manejador de finalización como el último argumento en la list de parameters.

Ejemplo:

 - (void)beginTaskWithName:(NSString *)name completion:(void(^)(void))callback; // calling [self beginTaskWithName:@"MyTask" completion:^{ NSLog(@"Task completed .."); }]; 

Más ejemplo con los methods de classs 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.."); }]; 

Bloques : Obj-c

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

Cierres : Swift

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

El cierre de finalización aquí, por ejemplo, es solo una function que toma la cadena de argumento y devuelve vacío.

Los cierres son bloques autónomos de funcionalidad que pueden pasarse y usarse en su código. Los cierres en Swift son similares a los bloques en C y Objective-C ya las lambdas en otros lenguajes de progtwigción.

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

Los cierres son objects de primera class, por lo que pueden anidarse y pasarse (como lo hacen los bloques en Objective-C). En Swift, las funciones son solo un caso especial de cierres.

En resumen: un controller de finalización es una variable que contiene un bloque (o un cierre – el equivalente Swift)