Swift基础之使用Alamofire库进行网络请求和断点下载
好久没有写过Swift相关的文章博客了,这里我就展示一下关于使用Alamofire库的方法
(2)其实 AFNetwork 的前缀 AF 便是 Alamofire 的缩写。
(3)Swift发布后,AFNetworking的作者又用Swift语言写了个相同功能的库,这便是 Alamofire。
(4)Alamofire 本质是基于`NSURLSession`,并做了封装。使用 Alamofire 可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。
Alamofire是基于NSURLRequest封装的,所以Cookie会自动保存,就和浏览器请求是一个效果。而且网站Set_cookie多久,本地的Cookie就多久,每次请求的时候都会自动带上cookie,直到过期。(所以像登陆session这些的都不用我们手动去处理)
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还提供了许多响应处理方法:
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库进行网络请求和断点下载的更多相关文章
- iOS开发网络篇—多线程断点下载
iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...
- [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式
两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...
- Flutter -------- Http库实现网络请求
第三方库 http实现网络请求,包含get,post http库文档:https://pub.dev/packages/http 1.添加依赖 dependencies: http: ^0.12.0 ...
- Android 利用an框架快速实现网络请求(含下载上传文件)
作者:Bgwan链接:https://zhuanlan.zhihu.com/p/22573081来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. an框架的网络框架是完全 ...
- [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- iOS swift HandyJSON组合Alamofire发起网络请求并转换成模型
在swift开发中,发起网络请求大部分开发者应该都是使用Alamofire发起的网络请求,至于请求完成后JSON解析这一块有很多解决方案,我们今天这里使用HandyJSON来解析请求返回的数据并转化成 ...
- [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Android Volley 库通过网络获取 JSON 数据
本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpC ...
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
随机推荐
- 【Android】Android Studio3.1 Mac版本设置项目桌面icon
近来项目处于测试阶段,工作少了许多,就装了个最新的Android Studio,想写一下安卓.新建好项目,想设置个桌面的icon.我先准备好自己的icon图片,然后复制粘贴到res/mipmap-hd ...
- 0307-关于html
html最主要的三点: 1.标签的写法.用法 <标签名 属性名1="属性值1" 属性名2="属性值2">内容</标签名> 比如:< ...
- [LeetCode] Max Stack 最大栈
Design a max stack that supports push, pop, top, peekMax and popMax. push(x) -- Push element x onto ...
- 关于自定义view--实现自定义水波纹效果
开发中的东西太多,怕自己忘记了,简单记录一下. 声明:此控件借鉴了大佬的想法,在此感谢大佬提供的支持,我只是把大佬的想法拿出来而已. ok,废话到此结束,看效果: 分析一下,我们可以看到,图中有两个圆 ...
- [USACO09DEC]牛收费路径Cow Toll Paths
跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费. 农场中 ...
- ●UVA 11021 tunnello
题链: https://vjudge.net/problem/UVA-11021题解: 概率DP. 定义dp[i]表示初始1只麻球的情况下,第i天都死完的概率. (因为每只麻球互相独立,那么最后答案为 ...
- bzoj 4008: [HNOI2015]亚瑟王
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- 【NOIP2013货车运输】
描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...
- cpu,核,进程与线程
多进程与多线程 一张图,先来回顾一下并行,并发,串行: 一.多核多线程 当我们要去买一台新电脑时,我们一般都会比较多台电脑的配置,而其中一项关键配置就是几核几线程.一般现在很多电脑都是4核8线程,甚至 ...
- linux退出状态码及exit命令
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码.对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量.它的值会变成由shell所执行的最后一条命令的退出状态码: [ro ...