Block
Syntax#
-
As a variable:
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {…};
-
As a property:
@property (nonatomic, copy) returnType (^blockName)(parameterTypes);
-
As a method parameter:
- (void)methodWithBlock:(returnType (^)(parameterTypes))blockName;
-
As a 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];
}];
The carat “^” character defines a block. For example, ^{ … }
is a block. More specifically, it is a block that returns “void” and accepts no arguments. It is equivalent to a method such like: “- (void)something;” but there is no inherent name associated with the code block.
Define a block that can accept arguments work very similarly. To supply an argument to a block, you define the block like so: *^(BOOL someArg, NSString someStr) { … }**. When you use API calls that support blocks, you’ll be writing blocks that look similar to this, especially for animation blocks or NSURLConnection blocks as shown in the above example.
Custom completion block for Custom Methods
1- Define Your own custom Block
typedef void(^myCustomCompletion)(BOOL);
2- Create custom method which takes your custom completion block as a parameter.
-(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- How to use block in your Method
[self customMethodName:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
Modify captured variable
Block will capture variables that appeared in the same lexical scope. Normally these variables are captured as “const” value:
int val = 10;
void (^blk)(void) = ^{
val = 20; // Error! val is a constant value and cannot be modified!
};
In order to modify the variable, you need to use the __block storage type modifier.
__block int val = 10;
void (^blk)(void) = ^{
val = 20; // Correct! val now can be modified as an ordinary variable.
};