使用block 进行回调 Cocoa
这两天稍微研究了下block,因为发现自己是在有很多不足。
我知道block 有个实现回调的能力,可以用来实现 delegate的功能,于是就在网上找了一点知识,自己实现了。权当是给自己mark 。如果有问题,请看官指出来,我也是一枚新手,期待进步。
第一步:通过宏定义一个 回调的 block ,名字叫 completCallBack ,返回void ,接受 successes , 和str 这两个参数,当然也可以更多。
typedef void(^completCallBack) (BOOL successed , NSString * str) ;
第二步:开发一个对外接口,这是要让 另一个类来调用的,我会考虑使用 + 方法,也就是类方法,这样调用的时候,可能不需要涉及到实例对象。接口如下:
+(void) finishedSymbol:(NSString *) symbol
withCallBack:(completCallBack) callBack ;
第三步:在.m 文件中实现这个接口的函数。封装,你懂的。
+(void) finishedSymbol:(NSString *) symbol
withCallBack:(completCallBack) callBack
{
callBack(YES,@"fucking the bich") ;
}
这个方法只是简单的给 callBack 传递参数,这里就是部分的信息,这些信息会被带入到掉一个类中。
< 以上步骤在 classA 中完成>
===============华丽丽的分割线 <以下部分在classB中完>=================
第四步:在一个需要的地方调用 class A 中开放出来的接口,为了简便,我在 viewdidload 中完成的
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[ViewController finishedSymbol:@"finished" withCallBack:^(BOOL successed, NSString *str) {
if (successed)
{
NSLog(@"%@",str ) ;
}
} ];
}
结果,在控制台答应出来了 结果如下:
2014-04-21 10:44:48.521 Block[1070:60b] fucking the birch
也就是说回调完成了,classA 中得信息,成果传递到了 classB中,通过block ,而不是使用 delegate。
总结, 其实会用协议,应该也就会用block 回调。协议中 delegate 的委托是指向了一个实例对象,而在block 中,委托是指向了一个 block ,简单的说,就是一个是要求一个实例对象去完成,另一个是要求 block 去完成,而block 由于语法特殊性,所以理解的时候,很费力。可以讲上述方法试着用 协议去实现,大概就能理解其中的味道了。这里我做的只是用block 实现最简单的信息传递,还有其他的,我自己理解也不是很深刻,需要继续学习。
参考以下文章:
http://themainthread.com/blog/2012/09/communicating-with-blocks-in-objective-c.html