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.
};