Szukaj…


Składnia

  • Jako zmienna:

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

  • Jako własność:

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

  • Jako parametr metody:

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

  • Jako typedef:

    typedef returnType (^ TypeName) (parameterTypes);

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

Animacje UIView

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

Karatowy znak „^” definiuje blok. Na przykład ^{ … } jest blokiem. Mówiąc dokładniej, jest to blok, który zwraca „void” i nie przyjmuje żadnych argumentów. Jest to odpowiednik metody takiej jak: „- (void) coś;” ale nie ma nieodłącznej nazwy związanej z blokiem kodu.

Zdefiniuj blok, który może akceptować argumenty, działa bardzo podobnie. Aby dostarczyć argument do bloku, zdefiniuj go tak: ^ (BOOL someArg, NSString someStr) {…} *. Gdy używasz wywołań API obsługujących bloki, będziesz pisać bloki, które wyglądają podobnie do tego, szczególnie dla bloków animacji lub bloków NSURLConnection, jak pokazano w powyższym przykładzie.

Niestandardowy blok uzupełniający dla metod niestandardowych

1- Zdefiniuj własny niestandardowy blok

typedef void(^myCustomCompletion)(BOOL);

2- Utwórz niestandardową metodę, która przyjmuje niestandardowy blok uzupełniający jako parametr.

-(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- Jak używać bloku w metodzie

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

Zmodyfikuj przechwyconą zmienną

Blok przechwytuje zmienne, które pojawiły się w tym samym zakresie leksykalnym. Zwykle te zmienne są przechwytywane jako wartość „const”:

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

Aby zmodyfikować zmienną, musisz użyć modyfikatora typu pamięci __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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow