Поиск…
Синтаксис
В качестве переменной:
returnType (^ blockName) (parameterTypes) = ^ returnType (parameters) {...};
Как собственность:
@property (nonatomic, copy) returnType (^ blockName) (parameterTypes);
В качестве параметра метода:
- (void) methodWithBlock: (returnType (^) (parameterTypes)) blockName;
Как typedef:
typedef returnType (^ TypeName) (parameterTypes);
TypeName blockName = ^ returnType (parameters) {...};
UIView Animations
[UIView animateWithDuration:1.0
animations:^{
someView.alpha = 0;
otherView.alpha = 1;
}
completion:^(BOOL finished) {
[someView removeFromSuperview];
}];
Карат «^» определяет блок. Например, ^{ … }
является блоком. Более конкретно, это блок, который возвращает «void» и не принимает аргументов. Это эквивалентно методу, например: «- (void)», но нет никакого неотъемлемого имени, связанного с блоком кода.
Определить блок, который может принимать аргументы, работает очень точно. Чтобы предоставить аргумент блоку, вы определяете блок следующим образом: ^ (BOOL someArg, NSString someStr) {...} *. Когда вы используете вызовы API, поддерживающие блоки, вы будете писать блоки, которые выглядят схожим с этим, особенно для блоков анимации или блоков NSURLConnection, как показано в приведенном выше примере.
Пользовательский блок завершения для пользовательских методов
1- Определите свой собственный пользовательский блок
typedef void(^myCustomCompletion)(BOOL);
2- Создайте собственный метод, который принимает ваш настраиваемый блок завершения в качестве параметра.
-(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- Как использовать блок в методе
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Изменить захваченную переменную
Блок будет захватывать переменные, которые появлялись в том же лексическом масштабе. Обычно эти переменные захватываются как значение «const»:
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
Чтобы изменить переменную, вам нужно использовать модификатор типа __block storage.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};