使用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

posted @ 2014-04-21 11:19  渐行渐远hewei  阅读(228)  评论(0编辑  收藏  举报