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又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译 ...
随机推荐
- eclipse导入项目Archive for required library cannot be read or is not a valid ZIP file
原因 :部分文件毁坏. 解决办法:1. 在eclipse中运行maven clean install 2. 报错,找到报错的文件物理删除,然后重新运行maven clean install 3. 循 ...
- Cookbook of QUnit
本篇文章是QUnit的简介,可以作为很好的入门教程.文章原址 介绍 自动化测试时软件开发过程中必不可少的一部分,而单元测试则是自动化测试的最为基本的一块,软件的每一个组件, 每一个功能单元都需要经过不 ...
- Struts2学习笔记--使用Response下载文件和Struts2的StreamResult文件下载
使用Response下载文件,servlet中的文件下载是通过流来实现的 我在webRoot文件夹下新建了一个文件夹from,里边放了一张图片,这里就以下载这张图片为例:download.jsp很 ...
- 详解用Navicat工具将Excel中的数据导入Mysql中
第一步:首先需要准备好有数据的excel: 第二步:选择"文件"->"另存为",保存为"CSV(逗号分隔)(*.csv)",将exce ...
- JS打印对象的方法&将Object转换为String的函数
1.有时候需要把对象中的字段属性打印出来,下面用JS实现输出对象: function writeObj(obj) { var description = ""; for (var ...
- X240 Win10企业版 14279版本 电池标尺白底问题
win10系统更新到14279版本: 电池标尺显示白底,而且右键也不可打开"启动电池管理器-" (1)首先安装lenovo settings 下载地址:http://think.l ...
- 你真的了解DOM事件么?
你真的了解DOM事件么? 我们大家都知道,人与人之间的交流可以通过语言,文字,肢体动作,面部微表情等,但是你知道Javascript和HTML之间是通过什么进行交互的么?你又知道Javascript和 ...
- 【原创】Kafka console consumer源代码分析(一)
上一篇中分析了Scala版的console producer代码,这篇文章为读者带来一篇console consumer工作原理分析的随笔.其实不论是哪个consumer,大部分的工作原理都是类似的. ...
- WEB架构师成长系列索引
WEB架构师成长系列索引 http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html
- Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...