Ricerca…


Sintassi

  • Come variabile:

    returnType (^ blockName) (parameterTypes) = ^ returnType (parametri) {...};

  • Come una proprietà:

    @property (nonatomic, copy) returnType (^ blockName) (parameterTypes);

  • Come parametro del metodo:

    - (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;

  • Come typedef:

    typedef returnType (^ TypeName) (parameterTypes);

    TypeName blockName = ^ returnType (parameters) {...};

Animazioni UIView

[UIView animateWithDuration:1.0
    animations:^{
        someView.alpha = 0;
        otherView.alpha = 1;
    }
    completion:^(BOOL finished) {
    [someView removeFromSuperview];
}];

Il carattere carato "^" definisce un blocco. Ad esempio, ^{ … } è un blocco. Più specificamente, è un blocco che restituisce "void" e non accetta argomenti. È equivalente a un metodo come: "- (void) something;" ma non esiste un nome intrinseco associato al blocco di codice.

Definire un blocco che possa accettare argomenti funziona in modo molto simile. Per fornire un argomento a un blocco, si definisce il blocco in questo modo: ^ (BOOL someArg, NSString someStr) {...} *. Quando si utilizzano chiamate API che supportano i blocchi, si scriveranno blocchi simili a questo, in particolare per i blocchi di animazione o i blocchi NSURLConnection, come mostrato nell'esempio precedente.

Blocco di completamento personalizzato per metodi personalizzati

1- Definisci il tuo blocco personalizzato

typedef void(^myCustomCompletion)(BOOL);

2- Creare un metodo personalizzato che accetta il blocco di completamento personalizzato come parametro.

-(void) customMethodName:(myCustomCompletion) compblock{
    //do stuff
    // check if completion block exist; if we do not check it will throw an exception
    if(complblock)
       compblock(YES);
  }

3- Come utilizzare il blocco nel metodo

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

Modifica la variabile catturata

Il blocco catturerà le variabili che sono apparse nello stesso ambito lessicale. Normalmente queste variabili sono catturate come valore "const":

int val = 10;
void (^blk)(void) = ^{
    val = 20; // Error! val is a constant value and cannot be modified!
};

Per modificare la variabile, è necessario utilizzare il modificatore del tipo di memoria __block.

__block int val = 10;
void (^blk)(void) = ^{
    val = 20; // Correct! val now can be modified as an ordinary variable.
};


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow