App的开发无外乎从网络端获取数据显示在屏幕上,数据做些缓存或者持久化,所以网络层极为重要。原来只是把AFNetwork二次封装了一下,使得调用变得很简单,并没有深层次的考虑一些问题。

前言

参考:

网络层设计方案

这篇文章提的问题也正是我平时经常纠结的,但是一直没有深入思考。文章给的解决方案和为什么这样做让人茅塞顿开。以下主要就是我的观后感。

三个问题

  • 使用哪种交互模式来跟业务层做对接?
  • 是否有必要将API返回的数据封装成对象然后再交付给业务层?
  • 使用集约化调用方式还是离散型调用方式去调用API?

我的设计

基本上每个网络层都会涉及到这三个问题。

我原先的设计是:

  1. //APIClient.h
  2. @interface APIClient : AFHTTPSessionManager
  3. + (instancetype)sharedRequestDataClient;
  4. /*
  5. * 用json格式(POST)
  6. */
  7. + (void)requestDataPostMethodWithHTTPPath:(NSString *)path
  8. parameters:(NSDictionary *)parameters
  9. success:(RequestSuccessBlock)success
  10. failure:(RequestFailureBlock)failure;
  11. /*
  12. * 用json格式(GET)
  13. */
  14. + (void)requestDataGetMethodWithHTTPPath:(NSString *)path
  15. parameters:(NSDictionary *)parameters
  16. success:(RequestSuccessBlock)success
  17. failure:(RequestFailureBlock)failure;
  18. @end
  19. //APIManager.h(一个个具体的请求,有多少个请求就有多少个方法)
  20. @interface APIManager : NSObject
  21. /**
  22. * 获取用户信息
  23. */
  24. + (void)requestUserInfoWithSuccess:(RequestSuccessBlock)success failure:(RequestFailureBlock)failure;
  25. ...
  26. @end
  27. @implementation APIManager
  28. /**
  29. * 获取用户信息
  30. */
  31. + (void)requestUserInfoWithSuccess:(RequestSuccessBlock)success
  32. failure:(RequestFailureBlock)failure {
  33. [APIClient requestDataGetMethodWithHTTPPath:kUserInfo parameters:nil success:success failure:failure];
  34. }
  35. ...
  36. @end

APIClient继承AFHTTPSessionManager,里面做了些设置,比方说统一用json,就两个方法,get,post请求。

本来还有上传下载数据两个方法,后来所有的资源文件放阿里云上,重建了个APIOSSClient类来处理。

APIManager具体处理一个个请求,有多少请求,他就有多少方法。由它来调用APIClient。

我的回答

  • 数据的传递方式:Block。
  • 交付什么样的数据:NSDictionary,在Block回调里把字典处理成最终需要的数据,大多数情况下是model,在model里会有数据处理。
  • APIClient是集约型,很不方便,加了个APIManager,实现离散型的调用,也就是加了个离散型调用的壳。

作者的建议

  • 数据的传递方式:Delegate。
  • 交付什么样的数据:不作处理,添加了reformer(名字而已,叫什么都好),用于封装数据转化的逻辑。
  • 离散型的API调用方式。

感想

看了作者的思路和源码,发现作者考虑的问题也都想到了,但是处理的方式有很大的问题。

传递方式和调用方式

最早我接手项目的时候,只有APIClient,简单地做AFNetwork做了封装,属于集约型API调用方式,用block回调是正常的。

后来发现集约型API调用方式的弊端太多了,于是我加了个APIManager,规定所有的请求必须在里面加个方法,算是加了个离散调用的壳。但是最后APIManager太大了,好多方法,维护起来好累。

所以调用的方式还是离散型的好,因为是离散型的,所有Delegate比Block好。

作者一个API对应于一个APIManager,更加容易维护。好处非常多。

传递数据

对于应该传什么数据,其实我们的理想情况是希望API的数据下发之后就能够直接被View所展示。首先要说的是,这种情况非常少。另外,这种做法使得View和API联系紧密,也是我们不希望发生的。

这是作者的想法,我们也发现了这个问题,所以会单独在写个类处理,或者转成model,在model里处理,最终变成view需要的数据。如果是model,为了不让view和model耦合,又加了个category传数据。

而作者加了个reformer统一处理,并且作者强调去model化,从根源解决了转化成本高,model和view耦合等问题。

细节就不讲了,作者开源的网络层很cool,除了使用起来非常方便,功能还非常全,全方面覆盖。小伙伴们自己去学习吧。

iOS网络层设计感想的更多相关文章

  1. 设计人员应该看的15个很酷的 iOS 8 设计

    苹果新一代智能手机 iPhone 6 发布已经有一段时间了,一些创意设计师已经开始在设计中采用 iOS 8 设计理念.当然,其中有些是对于未来的展望和大胆的设计.我在这里收集了15个很酷的 iOS 8 ...

  2. Swift 轻量级网络层设计

    前言 普遍我们的网络层设计的时候直接是如下结构APIManager.post(url, parameter,completeHandle),服务器配置在APIManager.m文件中进行配置.这样一个 ...

  3. iOS界面设计,12个优秀案例激发你的灵感

    总所周知,iOS和Android是当今两大移动平台,前者采用Human Interface Design,后者采用Material Design.作为设计师,尤其是App设计师,总是会在这两者进行设计 ...

  4. iOS界面设计之基础控件的学习 --- UITextField

    学习iOS界面设计也有段时间了,每次写到一些基础控件(如:UILable . UITextField)的时候就深觉应该总结一个函数来实现这些基础控件的属性设置,所以下面就是我对UITextField的 ...

  5. ios的设计原则

    ios的设计原则 iOS设计的详细的主要宗旨例如以下: 1.易操作,所关心的主题清新 2.UI控件布局合理,图片质量清新 3.用户的使用习惯 4.字体的大小,主次分明 5.舒适的动画效果 在创建一个新 ...

  6. iOS界面设计切图小结

    iOS界面设计切图小结 APR 12TH, 2013 1.基本尺寸 (1)界面 实际设计时按: iPhone4.4s:640px*960px iPhone5: 640px*1136px iPad:15 ...

  7. iOS的设计备忘录/资源集合(新手快速开发)

    iOS的设计备忘录 随着iOS7更新,风格走上扁平化,大部分iOS设计师及程序员都需要对自己的软件做相关调整,尺寸.Icon.UI等等,我在这里总结一下相关资料,以及提供一些关于iOS7设计素材. 一 ...

  8. HNU_团队项目_数据库设计感想_个人感想

    数据库设计感想  个人的一点心得体会 最重要的放在最前面——讨论开会时的123经验 开会前对会议目的及方式要有所考虑: 不要随意无目的开会: 遵守时间,控制会议时间长度: 会议主持人要维持会议只需,有 ...

  9. iOS网络层架构设计分享

    前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...

随机推荐

  1. linux下文件和目录的颜色表示

    蓝色表示目录: 绿色表示可执行文件: 红色表示压缩文件: 浅蓝色表示链接文件: 灰色表示其它文件: 红色闪烁表示链接的文件有问题了: 黄色是设备文件,包括block, char, fifo. (摘自: ...

  2. ucgui汉字库存放到外部的flash(控件可用)及写外部FLASH小软件

    源:ucgui汉字库存放到外部的flash(控件可用)及写外部FLASH小软件 如何将ucgui的汉字库存放到外部的flash memory(ucgui)(汉字库)(外部flash) ucgui的字库

  3. Jsoup使用教程

    一.解析和遍历一个HTML文档1.解析Html及Url链接 String html = "<html><head><title>First parse&l ...

  4. 6、手把手教你Extjs5(六)继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  5. STM8S awu及看门狗IWDG WWDG应用(转)

    源:STM8S awu及看门狗IWDG WWDG应用 AWU的应用(用库函数完成的) //切记要开启中断 且在中断函数中 AWU_GetFlagStatus(); 来清除中断 void AWU_SET ...

  6. iOS开发 missing iOS distribution signing identity for 。。。

    苹果真是不让人省心,新年一来上传APP,就出现Missing iOS Distribution signing indetity for xxx 于是就把证书删了做,做了删了再重做,还是不行 百度了一 ...

  7. javascript-函数及兼容

    1.事件绑定,删除,传播,默认方式,获取类型的兼容 var eventList = { //添加事件兼容 addEvent:function (event,type,backevent) { if ( ...

  8. chorme加减乘除浮点数处理

    在处理简单的1-0.7的时候发现chorme给的结果竟然是0.30000000000000004,瞬间蛋疼了,这数据能用?! 然后去百度找到了简单的两个数的加减乘除,然后修改了下,除了除法都可以多个数 ...

  9. 【滚动数组】【状压dp】Gym - 100956F - Colored Path

    f(i,j,S)表示到(i,j),且经由的路径上的颜色集合为S的价值的最小值,从上方和左方转移过来即可. 要注意,内存不足,需要滚动数组优化,即使用了map,还是需要. 路径输出的时候,可以再跑一遍d ...

  10. Swift 添加到TableView实现动画效果

    let indexPath = NSIndexPath(forRow:0 ,inSection:0) self.tableView.insertRowsAtIndexPaths([indexPath] ...