好久没写技术博客了,因为996的工作周期已经持续好几个月了。每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发。所以博客停歇了这么久,更新率也低了不少,今天补充一篇关于我巧用block传值的技术总结。

需求:在一个输入框,输入几个关键字,弹出搜索的关键字列表。

备注:通过关键字得到的完整的关键字列表的数据是通过网络请求后台返回的数据。

效果:

    

交互逻辑过程分析:

  这个搜索关键字的带输入框的控制器中,输入关键字"河南",然后将这个关键词作为网络请求的参数,请求关键词列表,也就是获取了搜索结果的数组,然后根据这个数组弹出UITableView展示数据,然后接着再输入关键词"理工",也就自然和前面拼接成"河南理工",又是将这个关键词进行网络请求,获得搜索结果数组,同样通过UITableView展示数据。很显然,包含河南理工四个字的结果也就只有"河南理工大学"了。

当然,这个"交互逻辑过程的分析"仅仅是一个业务逻辑过程的分析,但凡有点移动前端的开发经验的程序猿肯定能想到,在这个控制器的Textfield的监听方法里边添加搜索学校关键词的网络请求,然后在请求成功的block回调用,显示UITableView,加载搜索结果的数据数组。

但是这里,我还有一个进一步的需求,那就是这个带输入框的控制器在整个项目中,有很多地方公用,我要提高这个功能的复用性。比如搜索模块的搜索公司关键字,输入"广州",所有的"广州...有限公司"数据列表展示出来。如果按照前面的基本思路"在这个控制器的Textfield的监听方法里边添加搜索学校关键词的网络请求,然后在请求成功的block回调用,显示UITableView,加载搜索结果的数据数组",那么搜索公司关键字,也要在这个Textfield的监听方法里面添加搜索关键字的网络请求?这样根本就没起到软件开发"高内聚,低耦合"的作用。所以进一步的需要思考的就是,能否将这个网络请求公开在外部被调用,我只要求回传的是关键词数组就行,比如外部网络请求学校关键词数组,就传入学校关键词数组,然后通过TableView展示,外部网络请求公司关键词数组,就传入公司关键词数组,然后通过UITableView展示。也就是说,我这个带输入框的控制器只做搜索结果数组的数据展示的职责,网络请求的过程不属于这个功能模块的职责。<业务逻辑的职责抽离,实现解耦>

首先,我们基本知道,搜索结果的数组需要从外部传入,在这里也就是跳转控制器的前面一个控制器传入。这里就需要一个代理方法执行被回调传入,然后在这个代理方法实现的逻辑执行网络请求,但是这时候还有一个问题,那就是网络请求会有时间延迟,如果仅仅通过回调代理方法直接返回结果是不行的,因为代理方法的执行是不会延迟的,也就是直接被回调,然后直接返回,这是代码语言的本性,开发久了并且熟练代理方法和block回传的自然就会有所体会,所以这里网络请求block回传(比如你可能用的是AFN网络请求接口,成功之后block会返回data具体的数据),就不能通过代理方法中的return直接返回了,而是在代理方法再添加一个block再一次回传网络请求block回传的数据。代码如下:

回到带输入框的展示关键词列表控制器的内部:

iOS开发之巧用Block和代理方法结合来传值的更多相关文章

  1. ios开发UI篇—UIScrollView属性及其代理方法

    一.UIScrollView是什么? 1.UIScrollView是滚动的view,UIView本身不能滚动,子类UIScrollview拓展了滚动方面的功能. 2.UIScrollView是所有滚动 ...

  2. iOS开发之动画编程的几种方法

    iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...

  3. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  4. 【swift,oc】ios开发中巧用自动布局设置自定义cell的高度

    ios开发中,遇到自定义高度不定的cell的时候,我们通常的做法是抽取一个frame类,在frame类中预算好高度,再返回. 但是苹果出来自动布局之后...春天来了!!来看看怎么巧用自动布局设置自定义 ...

  5. 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性

    ios开发中我们打印对象的时候,会直接输出对象地址,这样不方便我们开发.我们可以 巧用 description 打印对象时,输出对象的属性 在oc中直接重写即可.swift中需要遵守Printable ...

  6. iOS开发 - OC - block的详解 - 基础篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  7. iOS开发 - OC - block的详解 - 深入篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  8. iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码

    开发的过程中,肯定会用到在视图想上滑动的时候,在导航处做一些操作,比如向上滑动的时候,做个动画,出现一个搜索框,或者其他的操作,那么我们怎么来判断它的滑动方向呢? 首先我们应该知道tableview继 ...

  9. iOS开发-项目的完整重命名方法,图文教程。

    前言:在IOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译 ...

随机推荐

  1. MySQL学习笔记八:日期/时间的处理

    MySQL日期时间的处理,在其官网文档上都有详细的阐述,想了解更多的同学可自行查阅. 1.查询当前日期时间:函数有now(),localtime(),current_timestamp(),sysda ...

  2. 如何利用Python生成随机密码

    写了个程序,主要是用来检测MySQL数据库的空密码和弱密码的, 在这里,定义了三类弱密码: 1. 连续数字,譬如123456,在get_weak_num中实现 2. 连续字母,譬如abcdef,在ge ...

  3. Windows Server 2008 R2 添加且制成“NFS服务器”角色后与Unix客户端匿名访问常见问题

    在复杂的主机与网络环境中,我们可能会接触到多种主机与操作系统,配合Windows Server 2008 R2的原生“NFS服务器”功能可以让这样的复杂操作系统更方便应用. 然而面对网络上众多的帮助指 ...

  4. MyEclipse打不开jsp文件 报错“Failed to create the part's controls"

    本来写好了一套网站html代码,需要移植到myeclipse的jsp页面中,当复制代码完毕后,也是可以运行的并不报错,但一直有弹框提示有空指针,当关闭页面后再次打开就歇菜了,提示 我预感到这可能是my ...

  5. vue+node开发手机端h5页面开发遇到的坑

    项目进行中...随时更新 这里记录了一些手机端调试的方式 一 css 1.文字超过span宽度显示...(单行文字) .topWrap .introduce span { padding: 0 17p ...

  6. 【JVM】JVM系列之执行引擎(五)

    一.前言 在了解了类加载的相关信息后,有必要进行更深入的学习,了解执行引擎的细节,如字节码是如何被虚拟机执行从而完成指定功能的呢.下面,我们将进行深入的分析. 二.栈帧 我们知道,在虚拟机中与执行方法 ...

  7. 大型网站提速关键技术(页面静态化,memcached,MySql优化)(二)

    一:页面静态化 几个概念: 静态网址:(比如:http://localhost/abc.html) 特点:1.利用seo(search engine optimization) 搜索引擎优化;2:访问 ...

  8. Apworks框架实战(二):开始使用

    要使用Apworks进行应用程序开发,您需要安装Visual Studio 2012以上的版本(以下简称Visual Studio 2012+),从Apworks 2.5开始,需要Micrsoft.N ...

  9. jquery easyui使用(四)······添加,编辑,删除

    前端: <div style="font-size: 25px; font-weight: 700; margin: 50px 0 10px 10px;"> 车辆登记 ...

  10. Chrome立体动画代码

    效果预览:http://hovertree.com/code/run/css/x8l6si70.html 请实用Chrome浏览器查看效果,手机上也可以. 代码如下: <!DOCTYPE htm ...