首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

block一点也不神秘————怎么利用block进行回调

2013-10-08 
block一点也不神秘————如何利用block进行回调我们在开发中常常会用到函数回调,你可以用通知来替代回调,但

block一点也不神秘————如何利用block进行回调

我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下:

1.我现在玩手机

2.突然手机没有电了

3.我只好让手机开始充电

4.充电的过程中我好无聊,我要去看电视,但是我不会一直看电视,我要等手机电充满了停止看电视,继续去玩手机

5.我开始看电视

6.手机电充好了,我听到手机响了一下,我不看电视了我继续去玩手机。


这个场景中哪里跟回调类似呢?哪里跟通知类似呢?其实我们可以认为手机充好电了通过回调的方式让我继续玩手机,也可以认为手机充好电了通知我可以继续玩手机,然后我主动继续玩手机。这里更像通知不像回调。但是换个思维想,如果手机本身没有回调机制,那他怎么能在恰好手机刚充满的时候响一下呢?

先不纠结这个问题,我们看看如果用block怎样来实现这样一个场景:

我们随便找个控制器写下以下代码:



所以我们应该让充电的线程和我看电视的线程错开执行!这里我们就不开新线程了,就让他10秒之后再执行吧。模拟下:



但是这里的参数我们该怎么传呢?我们通过这种方式传block参数好像不符合他这的object,所以我们还是直接调吧,但是把这一行用dispatch_after包起来~

block一点也不神秘————怎么利用block进行回调

按一下回车:

block一点也不神秘————怎么利用block进行回调

然后在中间写我要做什么,这里是出门逛街;

block一点也不神秘————怎么利用block进行回调

接下来在chargeIphone内部敲dis,然后联想出来选择第一个按回车:

block一点也不神秘————怎么利用block进行回调

然后将时间改为10,把整个方法内的代码移动进去:

- (void)viewDidLoad{    [super viewDidLoad];// Do any additional setup after loading the view.    NSLog(@"我在玩手机");    NSLog(@"手机没电了");       [self chargeMyIphone:^{        NSLog(@"出去逛街");    }];    NSLog(@"我在看电视");}-(void)chargeMyIphone:(void(^)(void))finishBlock{    double delayInSeconds = 10.0;    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){        NSLog(@"电充好了");        finishBlock();    });    }

现在代码的结构非常清晰:

充电完成之后 我要去逛街。

充电内部需要耗时10秒。

充电的同时我可以看电视。

充电完成之后回头来触发我block中设置的出去逛街。


这样设置block的好处我已经说过了,我们没有把充电函数内部的实现写死,也就是说当我完成之后无论做什么都无所谓,调的地方不同,传不同的代码过去就可以了,这个跟函数指针类似吧。

我们来运行一下程序验证下最后的结果:

2013-09-17 01:17:23.127 故事版应用[1088:a0b]我在玩手机

2013-09-17 01:17:23.129 故事版应用[1088:a0b]手机没电了

2013-09-17 01:17:23.129 故事版应用[1088:a0b]我在看电视

2013-09-17 01:17:33.130 故事版应用[1088:a0b]电充好了

2013-09-17 01:17:33.131 故事版应用[1088:a0b]出去逛街


完全验证了我们的结论,23秒开始充电 ,看电视,33秒的适合充好电出去逛街。

OK ,最简单的block我们就讲到这里,用好他来给你的代码非写死吧!DON'T HARD WRITE



热点排行