本文主要总结iOS网络层搭建中需要考虑的一些问题,注意这里真的只是列出了要解决哪些问题,并没有提出解决方案。如果有好的解决方法可以分享一下。
那么问题来了!
调用方式####
- 是使用集约型调用如下:
[ObjectClass postDataWithURL:url params:params class:class success:success failure:failure];
所有的请求都集中在一个类中,每个请求都是一个类方法,一般回调采用Block; - 还是使用离散型调用:
[instance loadDataWithParams:params success:success failure:failure];
每个请求都建立一个对象,使用时实例化对象并调用实例方法,可能对象
会比较多,但是对象多不好吗回调的话使用delegate和block,通知什么的也有。
那你会选择使用谁呢?优缺点各是什么呢?
发起请求
- 请求发起的条件
当用户不停的下拉刷新的时候,怎样避免每次下拉去发起一个请求呢?判断当前没有请求的时候再发起请求?还是取消前一次发起的请求呢?用户在买商品的时候不停的再筛选,这个时候又怎么发起请求呢? - 一个页面多个请求
一个页面的数据由多个API返回的数据组成,APIs全部请求完成再开始刷新界面,这又如何处理呢?例如sectionHeader是一个API返回数据,tableView是另一个API返回的数据。 - 请求嵌套
一个API返回的数据是另一个API的参数,例如先获取用户的ID,再用这个ID作为参数去请求用户收藏的文章。 - 分页请求
tableView分页请求,怎样封装才能让我们只需要调用接口,而不需要每次都关心++pageNumber
呢?
我们怎么才能处理好上述的情况呢?一个对象还是什么?
回调方式####
回调方式一般有Block,通知,KVO,delegate。这几种方式本身并无好坏,不同场景都有自己的优势。
成功和失败的回调是处理之后再返回呢?还是直接返回?怎么和业务层对接?
说个故事:有次需要修改某次请求成功后的逻辑,项目回调采用的是Block,请求是在Controller发起的,但是成功时回调的Block的实现并不在Controller中,将Block传给了一个View,view中继续传给了一个View。我不知道这样的缺点,但是我找起来真的好麻烦好吗?block可能还会延迟Controller的释放,请求发起之后,立马返回。Controller是不会立马释放的。
当然weak可以解决
那么这几种回调你采用的是哪一种呢?或者更倾向于哪一种呢?
缓存
- 读取本地缓存的同时去请求数据
例如微博,先展示上次请求的数据,当请求成功时候在替换调旧的数据刷新界面并保存在本地供下次使用。这样用户就不会傻傻的对着一个空白界面盯着菊花了。 - 只读取本地缓存
对于一些几乎不会变化的数据,请求一次就保存,以后只读取本地数据。比如k12教育类app的年级,几乎是不会变的。 - 短时间内的缓存
用户的信息不会不停的被修改的,用户不会那么无聊。那么获取用户信息的接口我们就可以设置一个59分钟的缓存。缓存时间内请求只读取本地数据,过期之后才会重新请求。
安全
某次比较闲,试试能不能抓包修改公司一个购买课程的app的课程价格,然而就这样成功了!两千被改成一毛。后来后台加了一个验证。就是将返回的数据,加密加密在加密,然后移动端作比对。如果比对不成功,那么就是数据在传输过程中被修改了。
那么采用什么样的安全机制呢?https?各种加密?
网上有很多例子,基本都解决上述的问题。毕竟带着问题再看如何解决问题,更有效果。