很久没写技术博客了,由于996的工做周期已经持续好几个月了。天天晚上回家都没有太多精力学习不少其余的东西,并且不少时候是接着完善工做的项目的模块开发。因此博客停歇了这么久,更新率也低了很多,今天补充一篇关于我巧用block传值的技术总结。前端
需求:在一个输入框,输入几个关键字,弹出搜索的关键字列表。数组
备注:经过关键字获得的完整的关键字列表的数据是经过网络请求后台返回的数据。网络
效果:学习
交互逻辑过程分析:spa
这个搜索关键字的带输入框的控制器中,输入关键字"河南",而后将这个关键词做为网络请求的参数,请求关键词列表,也就是获取了搜索结果的数组,而后根据这个数组弹出UITableView展现数据,而后接着再输入关键词"理工",也就天然和前面拼接成"河南理工",又是将这个关键词进行网络请求,得到搜索结果数组,一样经过UITableView展现数据。很显然,包含河南理工四个字的结果也就只有"河南理工大学"了。代理
固然,这个"交互逻辑过程的分析"仅仅是一个业务逻辑过程的分析,但凡是有点移动前端的开发经验的程序猿确定能想到,在这个控制器的Textfield的监听方法里边添加搜索学校关键词的网络请求,而后在请求成功的block回调用,显示UITableView,加载搜索结果的数据数组。blog
可是这里,我还有一个进一步的需求,那就是这个带输入框的控制器在整个项目中,有不少地方公用,我要提升这个功能的复用性。好比搜索模块的搜索公司关键字,输入"广州",全部的"广州...有限公司"数据列表展现出来。若是按照前面的基本思路"在这个控制器的Textfield的监听方法里边添加搜索学校关键词的网络请求,而后在请求成功的block回调用,显示UITableView,加载搜索结果的数据数组",那么搜索公司关键字,也要在这个Textfield的监听方法里面添加搜索关键字的网络请求?这样根本就没起到软件开发"高内聚,低耦合"的做用。因此进一步的须要思考的就是,可否将这个网络请求公开在外部被调用,我只要求回传的是关键词数组就行,好比外部网络请求学校关键词数组,就传入学校关键词数组,而后经过TableView展现,外部网络请求公司关键词数组,就传入公司关键词数组,而后经过UITableView展现。也就是说,我这个带输入框的控制器只作搜索结果数组的数据展现的职责,网络请求的过程不属于这个功能模块的职责。<业务逻辑的职责抽离,实现解耦>接口
首先,咱们基本知道,搜索结果的数组须要从外部传入,在这里也就是跳转控制器的前面一个控制器传入。这里就须要一个代理方法执行被回调传入,而后在这个代理方法实现的逻辑执行网络请求,可是这时候还有一个问题,那就是网络请求会有时间延迟,若是仅仅经过回调代理方法直接返回结果是不行的,由于代理方法的执行是不会延迟的,也就是直接被回调,而后直接返回,这是代码语言的本性,开发久了而且熟练代理方法和block回传的天然就会有所体会,因此这里网络请求block回传(好比你可能用的是AFN网络请求接口,成功以后block会返回data具体的数据),就不能经过代理方法中的return直接返回了,而是在代理方法再添加一个block再一次回传网络请求block回传的数据。代码以下:开发
回到带输入框的展现关键词列表控制器的内部:博客