一.定义一个block的过程
注明:A类(引用block的类)B类(声明block的类)
(1)声明一个block,如下:
B类
typedef void (^MyBlock)(NSString *);
(2)类里面定义block对象,如下:
B类
MyBlock my;(成员变量)
@property (nonatomic , strong) MyBlock myBlock;(属性)
(3)在block类里面声明一个含有block的方法,作用是在引用block的类里面调用block块,方面后面回调block里面的方法
B类
-(id)initwithBlock:(MyBlock)str;
A类
B *b = [[B alloc] initwithBlock:Block_copy(^(NSString *str){
NSLog(@"%@",str);
labShow.text = str;
})];
(4)触发block执行,执行后回调A类里面的方法
只要想办法执行block就行了,因为只有触发block才能实现方法的回调,下面分集中方法来触发
《1》如果B类里面触发,例如在B类里面声明一个按钮,点击按钮就触发block
-(id)initwithBlock:(MyBlock)str
{
self = [super init];
if(self)
{
_myBlock = str;
}
return self;
}
-(IBAction)back:(id)sender
{
NSString* s = txtView.text;
if(_myBlock)
{
_myBlock(s);
}
[self.navigationController popViewControllerAnimated:YES];
}
这样的话就出发了然后就去回调A类的含有block的方法了
《2》在A类里面调用B类的方法,B类直接声明类方法,方法里面触发block
A类
- (IBAction)btnClick:(UIButton *)sender
{
CGRect temp = CGRectMake(_btnOutlet.frame.origin.x, _btnOutlet.frame.origin.y, _btnOutlet.frame.size.width+50, _btnOutlet.frame.size.height+20);
[B ChangeRootViewBtnRect:temp blockcompletion:^(UIColor *colorEnum) {
/*函数回调 当block执行时就会回到这里*/
_btnOutlet.backgroundColor = colorEnum;
}];
}
B类
+ (void)ChangeRootViewBtnRect:(CGRect)rect blockcompletion:(Changcolor)Changcolorblock
{
UIColor *temp = [UIColor greenColor];
Changcolorblock(temp); //执行block
}
《3》在B类里面不声明含有block的方法直接声明block属性,直接声明block对象在对象里面添加实现的功能
B类
@property (nonatomic , strong) MyBlock my;(属性)
A类
A *block = [[A alloc] init];
block.testBlock = ^()
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Block学习" message:@"测试成功" delegate:self cancelButtonTitle:@"取消吧" otherButtonTitles:@"OK", nil];
[alert show];
};
[block StartBlock];
B类
在B.h
- (void)StartBlock;
在B.m
- (void)StartBlock
{
[self performSelector:@selector(test) withObject:nil afterDelay:2.0];
}
- (void)test
{
if (_myBlock) {
_myBlock();
}
}
总结:block实现过程就是调用block方法,触发block,然后回调block方法实现的内容