2013-05-01 11 views

risposta

215

1) Definire un proprio blocco di completamento,

typedef void(^myCompletion)(BOOL); 

2) Creazione di un metodo che prende il tuo completamento blocco come parametro,

-(void) myMethod:(myCompletion) compblock{ 
    //do stuff 
    compblock(YES); 
} 

3) Questo è come lo si utilizza,

[self myMethod:^(BOOL finished) { 
    if(finished){ 
     NSLog(@"success"); 
    } 
}]; 

enter image description here

+0

compclock (YES) è uguale a return compclock = YES? – user2206906

+0

Sì, ce l'hai, possiamo mettere compclock (YES)/compclock (NO) a seconda dei requisiti, possiamo restituire NO per i completamenti di errori qui –

+0

traccia il valore restituito: if (finished) NSLog (@ "success"); else NSLog (@ "failure"); –

2

variabili di blocco sono simili nella sintassi di funzionare puntatori in C.

Poiché la sintassi è brutto sono spesso typedefed, ma possono anche essere dichiarati normalmente.

typedef void (^MyFunc)(BOOL finished); 

- (void)myMethod:(MyFunc)func 
{ 
} 

Vedere questa risposta per non typedef:

Declare a block method parameter without using a typedef

+0

ok grazie lo controllerò, è un po 'complicato per me dove ho il typedef? – user2206906

+1

È possibile inserire il typedef nel file di intestazione, prima dell'interfaccia '@'. –

24

si definisce il blocco come un tipo personalizzato:

typedef void (^ButtonCompletionBlock)(int buttonIndex); 

Quindi utilizzare come un argomento di un metodo:

+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title 
          cancelAction:(ButtonCompletionBlock)cancelBlock 
         completionAction:(ButtonCompletionBlock)completionBlock 

Quando si chiama questo codice è proprio come qualsiasi altro blocco:

[SomeButtonView buttonViewWithTitle:@"Title" 
         cancelAction:^(int buttonIndex) { 
          NSLog(@"User cancelled"); 
        } 
        completionAction:^(int buttonIndex) { 
          NSLog(@"User tapped index %i", buttonIndex); 
        }]; 

Se arriva il momento di far scattare il blocco, è sufficiente chiamare completionBlock() (dove completionBlock è il nome della vostra copia locale del blocco).

+1

Una medaglia per te, gentile signore. – Josh

Problemi correlati