好久没有写过Swift相关的文章博客了,这里我就展示一下关于使用Alamofire库的方法

1、什么是Alamofire
(1)Alamofire 的前身是 AFNetworking。AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方HTTP网络基础库。
(2)其实 AFNetwork 的前缀 AF 便是 Alamofire 的缩写。
(3)Swift发布后,AFNetworking的作者又用Swift语言写了个相同功能的库,这便是 Alamofire。
(4)Alamofire 本质是基于`NSURLSession`,并做了封装。使用 Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
关于Cookie:
Alamofire是基于NSURLRequest封装的,所以Cookie会自动保存,就和浏览器请求是一个效果。而且网站Set_cookie多久,本地的Cookie就多久,每次请求的时候都会自动带上cookie,直到过期。(所以像登陆session这些的都不用我们手动去处理)

2、Alamofire的功能特性:
(1)链式的请求/响应方法
(2)URL / JSON / plist参数编码
(3)上传类型支持:文件(File )、数据(Data )、流(Stream)以及MultipartFormData
(4)支持文件下载,下载支持断点续传
(5)支持使用NSURLCredential进行身份验证
(6)HTTP响应验证
(7)TLS Certificate and Public Key Pinning
(8)Progress Closure & NSProgress
3、Alamofire库的简单使用:
首先通过Pods进行Alamofire的下载,需要注意的是使用Pods如果输出以下问题,

需要在Podfile文件中加入下面的代码:

然后在文件中导入import Alamofire就可以使用了
除了默认的 .Get 类型外,Alamofire还定义了许多其他的HTTP 请求方方式(HTTP Medthods)可以使用。
1
2
3
4
5
6
7
8
9
10
11
public enum HTTPMethod: String {
    case options = "OPTIONS"
    case get     = "GET"
    case head    = "HEAD"
    case post    = "POST"
    case put     = "PUT"
    case patch   = "PATCH"
    case delete  = "DELETE"
    case trace   = "TRACE"
    case connect = "CONNECT"
}

网络请求调用方法如下:

方法中包含五个参数:
参数一:URLConvertible表示URL地址
参数二:method表示请求方式(可省略,默认为.GET方式)
参数三:parameters表示请求字典参数(可省略,无参数的请求)
参数四:encoding表示编码方式(可删除,建议不使用就删除)
参数五:headers表示自定义http的头信息(可删除,建议不使用就删除)
代码如下:
只有URL地址的请求:
let urlStr = "http://www.healthmanage.cn/android/hrsBabyAction_loadHrsBabyHealth.action?";
let paramsDic:[String:Any] = ["userId":"38567","pagesize":"100","pageIndex":"1"];
Alamofire.request(urlStr, method: .post, parameters: paramsDic)
带有参数的请求:
Alamofire.request(urlStr, parameters: paramsDic)
带有请求方式的请求:
Alamofire.request(urlStr, method: .post, parameters: paramsDic)
带有编码方式的请求:

Alamofire.request(urlStr, method: .post, parameters: paramsDic,encoding: JSONEncoding.default)

带有请求头的请求:

let headers: HTTPHeaders = [
    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
    "Accept": "application/json"
]
Alamofire.request(urlStr, method: .post, parameters: paramsDic,encoding: JSONEncoding.default,headers:HTTPHeaders)
响应处理方法:Alamofire还提供了许多响应处理方法:
response()
responseData()
responseString(encoding: NSStringEncoding)
responseJSON(options: NSJSONReadingOptions)
responsePropertyList(options: NSPropertyListReadOptions)

直接在上面的请求方式后面调用方法,如:
Alamofire.request(urlStr, method: .post, parameters: paramsDic).responseJSON(completionHandler: { (responseObj) in
            
            switch(responseObj.result) {
            case .success(_):
                if let dataDic = responseObj.result.value as? NSDictionary{
                    print("输出此时的结果数据..........\(dataDic)");
                    
                    let itemArr:NSArray = dataDic.object(forKey: "ITEMS") as! NSArray;
                    self.dataArray = NSMutableArray.init(array: itemArr);
                    self.myTableView.reloadData();
                }
                break
                
            case .failure(_):
                print(responseObj.result.error!)
                break
            }
        });

这样基本的一个数据请求和数据返回响应就完成了。
4、断点下载
Alamofire提供了下载的请求方法和下载对象
//进度条
    var valueProgress:UIProgressView!;
    //开始,停止
    var bsBtn:UIButton!;
    //下载文件的保存路径
    var destinationPath:DownloadRequest.DownloadFileDestination!;
    //用于停止下载时,保存已下载的部分
    var cancelledData: Data?;
    //下载请求对象
    var downloadRequest: DownloadRequest!;

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.view.backgroundColor = UIColor.white;
        self.title = "下载页面";
        
        //设置下载路径。保存到用户文档目录,文件名不变,如果有同名文件则会覆盖
        self.destinationPath = { _, response in
            let documentsPath = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask)[0]
            let fileURL = documentsPath.appendingPathComponent(response.suggestedFilename!)
            //完成以后才会输出,记得这里查看地址的时候,要把地址最前面的file//去掉
            print("输出此时下载的地址位置。。。。。\(fileURL)");
            //两个参数表示如果有同名文件则会覆盖,如果路径中文件夹不存在则会自动创建
            return (fileURL,[.removePreviousFile, .createIntermediateDirectories])
        }
        
        //进度条
        self.valueProgress = UIProgressView.init(frame: CGRect.init(x: 50, y: 130, width: SCREEN_W-100, height: 50));
        self.valueProgress.progressViewStyle = UIProgressViewStyle.default;
        self.valueProgress.backgroundColor = UIColor.lightGray;
        self.view.addSubview(self.valueProgress);
        //开始,停止按钮
        self.bsBtn = UIButton.init(frame: CGRect.init(x: 50, y: 150, width: SCREEN_W-100, height: 50));
        self.bsBtn.setTitle("开始下载", for: UIControlState.normal);
        self.bsBtn.setTitleColor(UIColor.blue, for: UIControlState.normal);
        self.bsBtn.isSelected = false;
        self.bsBtn.addTarget(self, action: #selector(bsBtnClick(btn:)), for: UIControlEvents.touchUpInside);
        self.view.addSubview(self.bsBtn);
        
    }
    func bsBtnClick(btn:UIButton) {
        if btn.isSelected {
            btn.setTitle("开始下载", for: UIControlState.normal);
            btn.isSelected = false;
            
            //停止下载,记录下载进度
            self.downloadRequest.cancel();
        }else{
            btn.setTitle("停止下载", for: UIControlState.normal);
            btn.isSelected = true;
            
            //请求下载
            self.httpRequest();
        }
    }
    //MARK:-------------- 下载数据请求http
    func httpRequest() {
        
        if let cancelledData = self.cancelledData {
            self.downloadRequest = Alamofire.download(resumingWith: cancelledData,to: self.destinationPath);
        }else{
            //页面加载完毕就自动开始下载
            self.downloadRequest =  Alamofire.download(
                "http://dldir1.qq.com/qqfile/qq/QQ7.9/16621/QQ7.9.exe", to: self.destinationPath);
            //print("111111111111");
        }
        //下载进度
        self.downloadRequest.downloadProgress(queue: DispatchQueue.main,closure: downloadProgress);
        //下载数据响应
        self.downloadRequest.responseData(completionHandler: downloadResponse);
    }
    //MARK:------------下载过程中改变进度条
    func downloadProgress(progress: Progress) {
        //进度条更新
        self.valueProgress.setProgress(Float(progress.fractionCompleted), animated: true);
        //print(Float(progress.fractionCompleted));
        print("当前进度:\(progress.fractionCompleted*100)%");
    }
    //MARK:------------下载停止响应(不管成功或者失败)
    func downloadResponse(response: DownloadResponse<Data>) {
        switch response.result {
        case .success( _):
            //self.image = UIImage(data: data)
            self.bsBtn.setTitle("下载完成", for: UIControlState.normal);
            print("文件下载完毕: \(response)");
        case .failure:
            //意外终止的话,把已下载的数据储存起来
            self.cancelledData = response.resumeData;
        }
    }

Swift基础之使用Alamofire库进行网络请求和断点下载的更多相关文章

  1. iOS开发网络篇—多线程断点下载

    iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  2. [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式

    两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...

  3. Flutter -------- Http库实现网络请求

    第三方库 http实现网络请求,包含get,post http库文档:https://pub.dev/packages/http 1.添加依赖 dependencies: http: ^0.12.0 ...

  4. Android 利用an框架快速实现网络请求(含下载上传文件)

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/22573081来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. an框架的网络框架是完全 ...

  5. [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. iOS swift HandyJSON组合Alamofire发起网络请求并转换成模型

    在swift开发中,发起网络请求大部分开发者应该都是使用Alamofire发起的网络请求,至于请求完成后JSON解析这一块有很多解决方案,我们今天这里使用HandyJSON来解析请求返回的数据并转化成 ...

  7. [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. Android Volley 库通过网络获取 JSON 数据

    本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpC ...

  9. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

随机推荐

  1. 遗传算法详解(LINGO及MatlabGA工具箱求解实现)

    遗传算法 1.前言 遗传算法是一种基于生物界自然群体遗传进化机制的自适应全局优化概率搜索算法.它与传统算法不同,不依赖梯度信息,而是通过模拟自然进化过程来搜索最优解. 例子:兔子的遗传进化 有人说,现 ...

  2. [LeetCode] Asteroid Collision 行星碰撞

    We are given an array asteroids of integers representing asteroids in a row. For each asteroid, the ...

  3. [LeetCode] Count Different Palindromic Subsequences 计数不同的回文子序列的个数

    Given a string S, find the number of different non-empty palindromic subsequences in S, and return t ...

  4. [LeetCode] Next Greater Element III 下一个较大的元素之三

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  5. 实验吧_Guess Next Session&Once More(代码审计)

    Guess Next Session 看题目提示,是一道代码审计: <?php session_start(); if (isset ($_GET['password'])) { if ($_G ...

  6. [HNOI 2006]鬼谷子的钱袋

    Description 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政.有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会,其中有一 ...

  7. [SCOI2005]最大子矩阵

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  8. 计蒜客NOIP2017提高组模拟赛(三)day2-直线的交点

    传送门 简单几何+逆序对 发现当两条直线甲乙与平板的交点在上面甲在较左的位置,那么下面甲在较右的位置就可以相交 然后把上面的位置排下序,下面离散化+树状数组即可 #include<cstdio& ...

  9. NOIP 2013

    Prob.1 转圈游戏 找到循环节,然后快速幂.代码: #include<cstdio> #include<cstring> #include<iostream> ...

  10. bzoj1853[Scoi2010]幸运数字 容斥

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3027  Solved: 1128[Submit][Status ...