网上有很多回调的文章,都讲的比较详细,但是以前看过了用起来总感觉很生涩,尤其是看到别人写的回调的时候这种感觉特别明显。所以今天从接手的一个项目里找到一个回调事件进行特别的理解。顺便做一下笔记,加深一下印象,说实话对于很多人来说可能对于一件新鲜事物理解是很快的,但是过一段时间又要重新去理解。而这一点在我身上体现的特别明显。可能也是读书时候养成的一个不好的习惯吧。因为理解后也没去温习,或许说理解的时候没有特别去关注里面内在的一些特点。又或许是理解的比较随意吧!
回归正题说说今天的这个回调的例子吧,它是从一个界面的导航栏右侧的添加设备按钮去添加设备会进入另外一个界面,然后在另外一个界面添加设备信息,最后选择保存或者取消按钮跳回开始的界面然后刷新tabelview。好问题来了,如果不用回调我们会如何做呢,应该是通过调用点击添加设备的按钮跳到添加设备信息的界面,在该界面完善设备信息。如果是取消当然好,我们直接跳回原来的界面就好,如果是保存呢,那么我们应该会创建一个数组保存设备的信息,然后跳转界面的时候讲数组传递到开始的那个界面对应的数组中,同时刷新tableview,这样做是可以实现这样的一个效果,并且我以前也都是这么做的- -!。今天看到接手项目中的这样一个回调处理,我突然感觉对于以前陌生恐惧的回调事件突然可爱起来。
那么用回调的话我们是如何实现的呢?首先在完善设备信息的类中我们添加一个回调参数,并且带一个BOLL类型的参数:
void(^_complete)(BOOL isCancel);
然后在这个设备类中实现一个带回调参数的函数:
+ (TestViewController *)showInfoWithDevice:(NSInteger)device complete:(void (^)(BOOL))complete
{
TestViewController *testVC = [[TestViewControlleralloc] init];
testVC->_complete = [complete copy];
return testVC;
}
好了设备信息类的基础工作已经做好了,那么我们回到添加设备信息按钮方法里面:
TestViewController *testVC = [TestViewControllershowInfoWithDevice:0complete:^(BOOL isCancel) {
[self.presentedViewControllerdismissModalViewControllerAnimated:YES];
if (!isCancel)
{
dispatch_async(dispatch_get_main_queue(), ^{
[_tableView reloadData];
});
}
}];
到这里我们仅仅知道回调方法的作用的退回到开始的界面,然后判断回调参数里面BOOL类型的参数,如果为真我们什么都不做,如果为假我们就刷新tableView数据信息(其实就是设备的信息列表)。其实我刚开始还是一头雾水,我一直纠结于回调的参数在这两个函数里面都没有实际的值他们是如果传递的。想了好久都想不通(其实也是没有真正的理解回调的涵义)。最后我在设备信息类里面寻找有几个_complete,结果一下让我找出来多余的两个,如_complete(NO),_complete(YES);到这里我就彻底的明白了,原来所谓的回调函数真正起作用的时间是在你调用回调函数的时候,而不是你用了它就生效了,再一下这两个调用回调函数的地方,一个在取消按钮方法里面,一个在保存设备信息按钮方法里面。取消方法里面调用_complete(YES),这样就调用了回调函数同时使其生效并且传了一个YES类型的参数,作用到上面的函数中,就是退回到前面一个界面并且什么都不做。那个在保存设备信息按钮方法里面调用_complete(NO)就是回到前面一个界面并且刷新tableView里的设备列表信息。
注:
dispatch_async(dispatch_get_main_queue(), ^{
});
这是一个异步的主线程,让回调函数生效的那个时间点回到主线程中执行。总结:理解的东西并不代表会用,理解的东西不代表永远理解,理解的东西不代表真正已经理解了。也许换一种形式我们又不知道了,所以我们在工作中应该更多的去实际,更多的去扩展,让自己的经验真正的丰富起来,
最后祝大家工作顺利。