Поиск…


Синтаксис

  • В качестве переменной:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow