2011-11-05 19 views
6

La void (^)(void) sintassi del tipo di argomento 'completamento' realizzato con il metodo UIViewController:UIViewController dismissViewControllerAnimated tipo di argomento il completamento della sintassi

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

ha suscitato la mia curiosità e sono stato in grado di trovare alcuna documentazione per esso. Per favore, qualcuno potrebbe aiutare a spiegare il suo scopo/significato?

Molte grazie in anticipo.

risposta

12

Ecco la discussione di isolati dal mio libro:

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

C'è un esempio lì, ma ecco un esempio che è più vicino al genere di cosa stai chiedendo:

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

Il blocco di completamento accetta un parametro, un BOOL chiamato "done", ma questo non viene utilizzato dal suo codice. L'idea è che l'animazione viene eseguita e quindi viene eseguito il codice nel blocco di completamento.

È molto importante essere a proprio agio con i blocchi perché sono la via del futuro. Ad esempio, vista l'animazione in iOS 4 li usa, come spiegato nella sezione "Block Based View animazione" del mio libro (leggi prima la vecchia maniera, quindi leggere sul nuovo iOS 4 modo):

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

In iOS 5 blocchi sono ancora più importanti; ci sono sempre più situazioni in cui non sono opzionali.

Anche i blocchi sono il modo di utilizzare GCD (grand central dispatch), che è di gran lunga il modo migliore per fare multi-threading.

+0

Grazie matt, sembra un buon libro che hai scritto, qualche piano per una versione di iOS 5 ?! –

+1

@Eddie: Ho iniziato la conversione di tutti gli esempi scaricabili per iOS 5: https://github.com/mattneub/Programming-iOS-4-Book-Examples/tree/master/convertedToIOS5 Maggiori informazioni a seguire ... – matt

3

Questo sarebbe per un blocco di completamento. Un blocco è uno snippet di codice che può essere inviato come argomento (spesso visto, come qui, per la gestione del completamento) in un'API. Ci sono molte caratteristiche dei blocchi, inclusa la possibilità di fare riferimento alla memoria e mantenere lo stato.

vedere la documentazione su questa caratteristica sempre più popolare di Obj-C: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

blocchi forniscono quello che potrebbe essere considerato un comportamento di richiamata (tipicamente ottenuto con delega o notifica), ma permettono al programmatore di includere la logica del comportamento di completamento nello stesso contesto dell'azione di avvio, rendendo il codice più espressivo e comunicando concisamente la progressione completa del comportamento previsto.

+2

Si potrebbe aggiungere che è estremamente utile per eseguire qualsiasi pulizia o avviare altre azioni che devono essere eseguite dopo il licenziamento. Spesso usato al posto di un callback delegat – timthetoolman

+0

Grazie isaac, ho brevemente letto sui blocchi quando sono stati introdotti, ma non ho scioccamente cercato la sintassi! –

+0

@timthetoolman buon consiglio. Ho ampliato la risposta per includere il confronto con altri comuni meccanismi di gestione del completamento nel cacao. – isaac

Problemi correlati