iOS开发之巧用Block和代理方法结合来传值
好久没写技术博客了,因为996的工作周期已经持续好几个月了。每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发。所以博客停歇了这么久,更新率也低了不少,今天补充一篇关于我巧用block传值的技术总结。
需求:在一个输入框,输入几个关键字,弹出搜索的关键字列表。
备注:通过关键字得到的完整的关键字列表的数据是通过网络请求后台返回的数据。
效果:

交互逻辑过程分析:
这个搜索关键字的带输入框的控制器中,输入关键字"河南",然后将这个关键词作为网络请求的参数,请求关键词列表,也就是获取了搜索结果的数组,然后根据这个数组弹出UITableView展示数据,然后接着再输入关键词"理工",也就自然和前面拼接成"河南理工",又是将这个关键词进行网络请求,获得搜索结果数组,同样通过UITableView展示数据。很显然,包含河南理工四个字的结果也就只有"河南理工大学"了。
当然,这个"交互逻辑过程的分析"仅仅是一个业务逻辑过程的分析,但凡有点移动前端的开发经验的程序猿肯定能想到,在这个控制器的Textfield的监听方法里边添加搜索学校关键词的网络请求,然后在请求成功的block回调用,显示UITableView,加载搜索结果的数据数组。
但是这里,我还有一个进一步的需求,那就是这个带输入框的控制器在整个项目中,有很多地方公用,我要提高这个功能的复用性。比如搜索模块的搜索公司关键字,输入"广州",所有的"广州...有限公司"数据列表展示出来。如果按照前面的基本思路"在这个控制器的Textfield的监听方法里边添加搜索学校关键词的网络请求,然后在请求成功的block回调用,显示UITableView,加载搜索结果的数据数组",那么搜索公司关键字,也要在这个Textfield的监听方法里面添加搜索关键字的网络请求?这样根本就没起到软件开发"高内聚,低耦合"的作用。所以进一步的需要思考的就是,能否将这个网络请求公开在外部被调用,我只要求回传的是关键词数组就行,比如外部网络请求学校关键词数组,就传入学校关键词数组,然后通过TableView展示,外部网络请求公司关键词数组,就传入公司关键词数组,然后通过UITableView展示。也就是说,我这个带输入框的控制器只做搜索结果数组的数据展示的职责,网络请求的过程不属于这个功能模块的职责。<业务逻辑的职责抽离,实现解耦>
首先,我们基本知道,搜索结果的数组需要从外部传入,在这里也就是跳转控制器的前面一个控制器传入。这里就需要一个代理方法执行被回调传入,然后在这个代理方法实现的逻辑执行网络请求,但是这时候还有一个问题,那就是网络请求会有时间延迟,如果仅仅通过回调代理方法直接返回结果是不行的,因为代理方法的执行是不会延迟的,也就是直接被回调,然后直接返回,这是代码语言的本性,开发久了并且熟练代理方法和block回传的自然就会有所体会,所以这里网络请求block回传(比如你可能用的是AFN网络请求接口,成功之后block会返回data具体的数据),就不能通过代理方法中的return直接返回了,而是在代理方法再添加一个block再一次回传网络请求block回传的数据。代码如下:


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

iOS开发之巧用Block和代理方法结合来传值的更多相关文章
- ios开发UI篇—UIScrollView属性及其代理方法
一.UIScrollView是什么? 1.UIScrollView是滚动的view,UIView本身不能滚动,子类UIScrollview拓展了滚动方面的功能. 2.UIScrollView是所有滚动 ...
- iOS开发之动画编程的几种方法
iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- 【swift,oc】ios开发中巧用自动布局设置自定义cell的高度
ios开发中,遇到自定义高度不定的cell的时候,我们通常的做法是抽取一个frame类,在frame类中预算好高度,再返回. 但是苹果出来自动布局之后...春天来了!!来看看怎么巧用自动布局设置自定义 ...
- 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性
ios开发中我们打印对象的时候,会直接输出对象地址,这样不方便我们开发.我们可以 巧用 description 打印对象时,输出对象的属性 在oc中直接重写即可.swift中需要遵守Printable ...
- iOS开发 - OC - block的详解 - 基础篇
深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...
- iOS开发 - OC - block的详解 - 深入篇
深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...
- iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码
开发的过程中,肯定会用到在视图想上滑动的时候,在导航处做一些操作,比如向上滑动的时候,做个动画,出现一个搜索框,或者其他的操作,那么我们怎么来判断它的滑动方向呢? 首先我们应该知道tableview继 ...
- iOS开发-项目的完整重命名方法,图文教程。
前言:在IOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译 ...
随机推荐
- C#:Md5和Sha1两种加密方式
1.新建控制台应用程序 2.新建类 EncryptHelper.cs public static class EncryptHelper { /// <summary> /// 基于Md5 ...
- IOS开发之自定义Button(集成三种回调模式)
前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...
- IOS开发之TabBarItem&NavigationBarItem
想必大家都用过微信,微信间的页面切换是如何做成的呢?接下来我们用storyboard结合着代码来模拟一下微信的视图控制模式. "工欲善其事,必先利其器",下面主要是对storybo ...
- 改变word的语言字典
改变word的语言字典 上周末看论坛有人提出否有方法用代码改变word的语言字典,因为默认的语言会影响现用语言输入的拼写器和其他校对工具.我们的Spire.doc正好支持,正好闲来无事所以我用西班牙语 ...
- js 对闭包的理解
<!DOCTYPE html> <html> <body> <p>局部变量计数.</p> <button type="but ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...
- 设置 LongListSelector 只有在项多的时候才分组
Windows Phone 中的控件LongListSelector是一个很好的分组聚类控件,当列表中数据特别多的时候,LongListSelector就像字典中的目录,让我们很快定位到要找的数据. ...
- 用API网关把API管起来
最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合 ...
- LINQ之延迟加载及其原理
这是LINQ(集成化查询)的继续及补充,在前面我已经介绍过,在LINQ中,一个重要的特性就是延迟加载,是指查询操作并不是在查询运算符定义的时候执行,而是在真正使用集合中的数据时才执行(如:在遍历集合时 ...
- 在 WCF 中使用高效的 BinaryFormatter 序列化
本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果 ...