iOS 第三方SDK的二次封装
我们在项目中会使用到很多的第三方的sdk例如AFN、友盟、share、支付宝、微信支付、ping++、环信、融云等等,sdk的版本更新速度快,为了解耦和,快速替换sdk,进行二次封装是有必要的。
以二次封装网络请求为例,二次封装是为了快速退换sdk,使用最新的方法,完善项目Bug,现在大部分对网络请求都采用block进行简单的封装,但是这样做在简单的项目中还是比较使用的,但是存在潜在的问题,如果有三四个网络请求有依赖关系,也就是说block中里嵌套block,这样的代码维护起还是挺费事的。也有人采用设置协议完成代理来实现封装的,这样在控制器中实现代理方法中会使用到很对的if和else if 来判断相关的网络请求。还有一部分人会使用通知来完成相关的信息传递,用通知的好处就是可以把每一个请求的回调分离开来,在代码和美观度上比block和协议代理方式要好。三种方案各有各的优势各有各的缺点,如果把三种方法综合起来使用,取长补短堪称完美。
简单介绍下,在项目中怎么封装网络请求的,会创建一个基类BaseModel来发送通知给控制器,所有处理网络请求的类都继承BaseModel,建立一个网络请求RemoteDataResolver类,统一进行与后台的网络交互,在RemoteDataResolver类中使用AFN进行网络请求,这样做的好处是如果AFN更新了或者AFN不在更新,有更好的网络请求库,我们只需要在RemoteDataResolver类中进行替换就行,在AFN之前有一个ASI的网络请求库当时候基本上都在使用,如果是在很多地方都使用了ASI,现在要替换成AFN肯定是非常困难的事情,但是在一个类中就不一样了,可以说不费吹飞之力就能完成的事情。在RemoteDataResolver类中进行网络请求会存在一个问题,可能子线程开辟会过多,一台机器开辟的子线程是有限的,为了优化性能,我利用队列来维护所有的请求,等一个请求完成,下一个请求进行。利用数组来模拟队列,队列最大的特点就是先进先出。如果是在不同线程进行网络请求,会有线程安全问题,因此我们要给请求加上锁,这样就比较完善了。再建立一个ModelDelegate类指定协议,在继承BaseModel类中实现ModelDelegate的方法,简单处理回调过来的数据,发送通知给控制器,进行数据展示和信息提示。
自定义的类BaseModel ----- 发送通知给控制器
ModelDelegate ------ 协议代理
ModelGlobals ----- 通知中关键字定义
RemoteDataResolver ------ 网络请求(不包含图片上传)
ResourceManager ----- 上传图片网络请求