Swift -- 对AFN框架的封装

一.封装AFN的目的

  • 简单的说: 解耦

  • 日常工作中,我们一般都不会去直接使用AFNetWorking来直接发送网络请求,因为耦合性太强,假设有多个控制器都使用AFN发送请求,那么假设有一天AFN框架的作者不更新了,到时我们需要改动的地方太多太多~

  • 所以这里我们要自己来封装AFN

二.封装之前准备工作:

  • 利用cocoapods集成AFN框架

三.封装AFN的方式

  • 封装AFN有两种方法:

    • 工具类,继承NSObject
    • 继承AFHTTPSessionManager

四.封装实现

第一种, 继承NSObject封装AFN

实现代码如下:

import UIKit
import AFNetworking // 请求类型
enum RequestType
{
case Get
case Post
} class MTYNetWorking: NSObject { // 单例
static let shareInstance = MTYNetWorking() // 懒加载 - 方式1: 单纯的懒加载
lazy var mgr = AFHTTPSessionManager() /* 懒加载 - 方式2: 可以对请求管理者做些初始化的操作
lazy var mgr = { // 可以做些初始化的操作
return $0 }(AFHTTPSessionManager())
*/ /// 对外提供的网络请求接口
///
/// - Parameters:
/// - requestType: 发送请求的类型,是个枚举
/// - url: 请求路径
/// - parameters: 请求参数,字典类型
/// - resultBlock: 请求结果
func request(requestType:RequestType,
url:String,
parameters:[String: Any],
resultBlock:@escaping (_ response: [String: Any]?,_ error: String?) -> ())
{ // 请求成功的闭包
let successBlock = { (task: URLSessionDataTask, response: Any?) in
// 拿到结果
resultBlock((response as? [String: Any])!, nil)
} // 请求失败的闭包
let failuerBlock = { (task: URLSessionDataTask?, error: Error) in
// 拿到结果
resultBlock(nil, error.localizedDescription)
} // 发送异步 Get请求
if requestType == .Get {
mgr.get (
url,
parameters: parameters,
progress: nil,
success: successBlock,
failure: failuerBlock
) // 发送异步 Post请求
}else if requestType == .Post
{
mgr.post (
url,
parameters: parameters,
progress: nil,
success: successBlock,
failure: failuerBlock
) } } }

封装时的注意点:

1.单例:

因为上面的封装使用的是对象方法,外界模块在使用我们这个工具类时每次都会创建一个对象,来调用接口,然后他们并不会被释放,所以为了保证整个内存里面只存在一个对象,要使用单例.

// static 保证内存中只有1份
// let 常量,不可以被改变
// 因为shareInstance这个属性是依附于类(MTYNetWorking)的,所以只有一份
static let shareInstance = MTYNetWorking()

2.懒加载请求管理者的两种方式

3.为什么使用闭包来传值

  • 设计这个接口的最终目的,就是拿到请求后的返回结果.但是我们不能把这个结果放到方法的返回值处,这样外界在调用的时候要么立即拿到这个结果,否则就会等待这个结果,也就是发送了一个同步的请求,这样会阻塞主线程,影响用户的体验,所以一般使用逃逸闭包来传值
  • AFN框架的success和failure后面的闭包的目的就是要告诉我们请求结果的,无论是请求成功还是失败
  • 而我们设计这个接口的目的就是通过闭包来告诉外面的结果

第二种, 继承AFHTTPSessionManager封装AFN

代码实现

import UIKit
import AFNetworking // 请求类型
enum RequestType2
{
case Get
case Post
} class MTYNetWorkingTool: AFHTTPSessionManager { // 单例
static let shareInstance = MTYNetWorkingTool() func request(type: RequestType2,
url: String,
parameters: [String: Any],
resultBlock:@escaping ((_ response:[String: Any]?, _ error: Error?) ->())) { // 成功的闭包
let successBlock = { (task: URLSessionDataTask, response: Any?) in resultBlock(response as? [String: Any], nil)
} // 失败的闭包
let failureBlock = { (task: URLSessionDataTask?, error: Error) in resultBlock(nil, error)
} // Get 请求
if type == .Get { get(
url,
parameters: parameters,
progress: nil,
success: successBlock,
failure: failureBlock
)
// Post请求
}else if type == .Post { post(
url,
parameters: parameters,
progress: nil,
success: successBlock,
failure: failureBlock
) }
} }

如有错误之处,请指正!谢谢~

Swift -- 对AFN框架的封装的更多相关文章

  1. AFN框架基本使用

    0.AFN框架基本使用 0.1 AFN内部结构 AFN结构体 - NSURLConnection + AFURLConnectionOperation(已经被废弃) + AFHTTPRequestOp ...

  2. AFN框架

    0.AFN框架基本使用 0.1 AFN内部结构 AFN结构体 - NSURLConnection + AFURLConnectionOperation(已经被废弃) + AFHTTPRequestOp ...

  3. 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)

    文件夹      [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器開始(八)      [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入 ...

  4. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据

    当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...

  5. 第二百六十七节,Tornado框架-分页封装模块

    Tornado框架-分页封装模块 框架引擎 #!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web # ...

  6. 【JavaScript框架封装】实现一个类似于JQuery的缓存框架的封装

    // 缓存框架 (function (xframe) { /** * 实现了缓存框架的临时存储功能(内存存储) * @type {{data: Array, get: (function(*): *) ...

  7. 【JavaScript框架封装】实现一个类似于JQuery的动画框架的封装

    // 动画框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({}); // 不需要参与链式访问的 ...

  8. ios开发瀑布流框架的封装

    一:瀑布流框架封装的实现思路:此瀑布流框架的封装仿照tableView的底层实现,1:每个cell的frame的设置都是找出每列的最大y值,比较每列的最大y值,将下一个cell放在最大y值最小的那一列 ...

  9. JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、

    缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for…in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/ ...

随机推荐

  1. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter

    “.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社 ...

  2. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  3. C语言 · 数位分离

    问题描述 编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示. 输入格式:输入只有一行,即一个1000以内的正整数. 输出格式:输出只有一行,即该整数的每 ...

  4. MSDN文档篇

    很多人网上下载3~10G不等的MSDN文档,发现,下载完成了不会用 很多人每次都得在线下载文档,手上万千PC,都重新下载不是得疯了? so==> 先看几张图 推荐一个工具:https://vsh ...

  5. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  6. ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求

    我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...

  7. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  8. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  9. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  10. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...