# Block
# 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");
}
}];
# 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.
# 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.
};