先说我们最基本的使用:
这是我们得到的response.result.value就是我们原始的数据
1、设置路由
我们有时候有这样的需求,那就是根据不同的请求类型,我们组装url或者参数的方式不一样,而最终生成的request 不一样,所以我们这个时候我们希望根据我们传进去的type自动生成request。
request有一个对象方法,我们只需要定义生成request的方法,request对象会自己调用这个方法,生成request
这个地方的参数 urlRequest 是一个继承URLRequestConvertible的数据,不一定要对象,只要继承URLRequestConvertible 协议,实现了协议的asURLRequest 方法,这个方法就会自动被调用,生成request给请求使用,我们这儿有多种type,然后生成对应的request,所以我们使用枚举比较合适 代码如下
而我们调用的时候,只需要指明枚举类型,给枚举参数,就会自动生成request,代码如下
我们给上面的操作给一个高大上的名字,设置路由。
2、 通过map 很简单生成一个数组
先上代码:
我们的需求是比如现在indexPath到了15,新来了5个数据,我们就需要 5个indexPath,section为0,index为16-20,按照我们常规的写法,for一个循环,i从16到20,初始化5个indexPath,然后将这几个indexPath放入一个数组。
这儿我们一句话解决,这种语法很好,我们要经常使用
3、定义方法,直接从原始数据中取出我们需要的数据(image、model)返回。
一般情况下服务端会返回一大段我们不需要的数据,我们要解析数据,等等,而且有时候我们需要整个数据中的image,有时候又需要另外一个model,所以这个时候我们希望有个方法可以根据我们的定义,直接在结果中返回我们需要的东西
我们先看下response拿到结果后的实现
我们分析下上面的代码
第一个是request的方法,他会把我们的数据封装到DataResponse里,结合第二张图片我们可以知道,DataResponse后尖括号的泛型就是result的value,我们再看一张图片
request的类方法serializeResponseData,返回的就是result,data就是我们原始得到的data,所以我们可以自定义类似于serializeResponseData这样的方法,返回我们自己需要的数据类型。我们先自定义一个返回result的value为image类型的方法
返回值是DataResponseSerializer
他是继承与协议DataResponseSerializerProtocol的,满足于我们第一张图片的要求。
所以执行下面方法后,我们的result的value就会是我们自己想要的类型了
当然我们需要用request去调用这个方法
这样我们直接拿到的就是image了。
但是我们经常想要的是,传进去一个model,出来就直接是这个model的数据,其实是一样的道理。
改下上面的responseImage ,看下面的方法
区别在哪儿,我们先将response的data转化为json数据拿出来,拿到json数据后,我们根据我们传进来的类,实现一个初始化方法,参数就是我们的json数据,但是我们初始化方法需要我们自己在我们的model里面定义,那么多model,都是根据json数据定义的,所以我们可以让我们所有的model实现一个相似的类方法,这儿就可以使用协议了。
上面是一个类实现的协议初始化方法,后面实现的是继承协议,所以我们传一个类名进去,在model里实现协议定义的初始化方法,就ok了,再看下怎么调用的
这样我们拿出来的就直接是model了
但是我们有时候还想拿数组怎么办,其实是一样的区别只是在 协议的方法,我们不用对象方法了,直接用类方法,看代码
区别就是,一个是根据json对象生成model的对象(类的初始化方法),一个是生成model的数组(类方法)。
我们再看下调用的地方
这个大概就说完了,总结下,好的地方在哪儿呢,还是在于协议的活用,它只是一个协议,我们只要满足协议,可以定义任意数据类型,满足我们的需求。
我们上面关键的点在,我们自定义request的类似于serializeResponseData 这样的类方法,只要返回值满足DataResponseSerializerProtocol 就行,而我们有一个结构体,他就是继承与上面的protocol的,只要我们返回我们的结构体就行了,这个结构体就是DataResponseSerializer,所以我们要做的,就是构造这个结构体,然后返回这个结构体。这个结构体将作为
的第二个参数,调用上面的方法,就会将结果按照我们想要的形式返回了,而在哪儿返回的呢,在上面方法的第三个参数(closure)的DataResponse的result的value里面。
打完收工。
所以,总要的事情说三遍:(协议、继承、泛型) * 3
参考资料:Alamofire 网络库使用基础教程 Alamofire 网络库使用基础教程