2011-11-05 15 views
6

La sintaxis void (^)(void) de la 'conclusión' tipo de argumento que implementa el método UIViewController:UIViewController dismissViewControllerAnimated tipo de argumento finalización sintaxis

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion 

ha despertado mi curiosidad y he sido incapaz de encontrar ninguna documentación para ello. ¿Podría alguien ayudar a explicar su propósito/significado?

Muchas gracias de antemano.

Respuesta

12

Aquí está la discusión de cuadras de mi libro:

http://www.apeth.com/iOSBook/ch03.html#_blocks

Hay un ejemplo allí, pero aquí hay un ejemplo que está más cerca de la clase de cosa que usted está preguntando por:

[self transitionFromViewController:fromvc 
        toViewController:tovc 
          duration:0.4 
          options:UIViewAnimationOptionTransitionFlipFromLeft 
         animations:nil 
         completion:^(BOOL done){ 
          [tovc didMoveToParentViewController:self]; 
          [fromvc removeFromParentViewController]; 
         }]; 

El bloque de finalización toma un parámetro, un BOOL llamado "hecho", pero esto no es usado por su código. La idea es que la animación se realice y luego se ejecute el código en el bloque de finalización.

Es muy importante sentirse cómodo con los bloques porque son la forma del futuro. Por ejemplo, la vista de la animación en IOS 4 los utiliza, como se explica en la sección "Bloquear visión basada en la animación" de mi libro (leer primero acerca de la manera antigua, a continuación, leer sobre el nuevo iOS 4 vías):

http://www.apeth.com/iOSBook/ch17.html#_view_animation

En iOS 5 bloques son aún más importantes; cada vez hay más situaciones en las que no son opcionales.

También los bloques son la forma de usar GCD (despacho de gran central), que es por mucho la mejor manera de hacer multi-threading.

+0

Gracias Matt, parece un gran libro que has escrito, ¿algún plan para una versión de iOS 5? –

+1

@Eddie: He empezado a convertir todos los ejemplos descargables para iOS 5: https://github.com/mattneub/Programming-iOS-4-Book-Examples/tree/master/convertedToIOS5 Más información a seguir ... – matt

3

Eso sería para un bloque de finalización. Un bloque es un fragmento de código que puede enviarse como argumento (a menudo visto, como aquí, para el manejo de finalización) a una API. Hay muchas funciones de bloques, incluida la capacidad de referenciar la memoria y mantener el estado.

Consulte la documentación sobre esta función cada vez más popular de Obj-C: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Bloques proporcionar lo que podría considerarse el comportamiento de devolución de llamada (por lo general alcanzado con la delegación o notificación), pero permiten que el programador para incluir la lógica de la Comportamiento de finalización en el mismo contexto que la acción de iniciación, haciendo que el código sea más expresivo y transmitiendo la progresión completa del comportamiento previsto de forma concisa.

+2

Es posible que desee agregar que es extremadamente útil para realizar cualquier limpieza o iniciar otras acciones que deben realizarse después de la salida. A menudo se usa en lugar de una devolución de llamada delegativa – timthetoolman

+0

Gracias isaac, leí brevemente sobre los bloques cuando se presentaron pero ¡tontamente no había analizado la sintaxis! –

+0

@timthetoolman buenos consejos. He ampliado la respuesta para incluir una comparación con otros mecanismos comunes de manejo de finalización en el cacao. – isaac

Cuestiones relacionadas