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;
}
}
http://www.taodudu.cc/news/show-5261553.html
相关文章:
- Android自定义View,实现全屏滑动的DrawerLayout
- AnyView --哗众取宠的介绍词
- 使用ViewServer让Android真机连接Hierarchy Viewer的步骤
- MVVM+ViewBinding+Kotlin入门
- SpringMVC常见组件之View分析
- Moto E6 安装Anyview完全手册
- 前端js下载txt文本
- ANYVIEW(网络警)安装与测试
- anyview+4.0java版_Anyview v4.0.12[带证书]
- AnyView网络警V4破解版(26用户正式版)
- JS实现鼠标滑过图片的抖动效果
- ie6注释造成文字“重影”分析。双文字
- 将VMProtect集成到应用程序教程:许可API函数
- 代码保护软件VMProtect用户手册之内置脚本的使用(2)——PE文件
- VMProtect 3.09 虚拟机架构浅析
- 代码保护软件VMProtect用户手册之内置功能(1)——字符串功能作用
- CentOS最新版本和历史版本下载方法
- 电子相册制作软件会声会影
- python Pyqt5 QLabel控件 自定义添加鼠标单击信号/事件 双击信号/事件
- vue中鼠标单击事件与双击事件 的绑定 以及修饰符
- html页面鼠标单击----------爱心特效
- C#制作挂机程序V2.0—刷鼠标单击类在线视频
- LabVIEW中利用事件结构演示用鼠标单击前面板窗口时,发生鼠标按下事件并处理鼠标按下事件
- MFC vc++ 中CTreeContrl如何自定义实现鼠标单击或双击响应事件 ,即重写类似于控件的响应事件或消息
- 计算机硬盘用u盘维修,U盘装机大师修复磁盘坏道详细教程
- Java毕业设计-社区诊所管理系统
- ORACLE游标上限问题
- Oracle游标设置
- oracle游标用法
- oracle 游标的使用
Swift基础之使用Alamofire库进行网络请求和断点下载相关推荐
- iOS开发网络篇—多线程断点下载
iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...
- 零基础学Python-爬虫-1、网络请求Requests【网络操作理论基础与实践·请认真看看理论,理论基础决定后期高度】
本套课程正式进入Python爬虫阶段,具体章节根据实际发布决定,可点击[python爬虫]分类专栏进行倒序观看: [重点提示:请勿爬取有害他人或国家利益的内容,此课程虽可爬取互联网任意内容,但无任何收 ...
- [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?
在可滚动视图(如UITableView)中异步加载大量图片是一个很常见的任务. 然而,在图片正在下载的同时又要保持应用程序流畅滚动,可能有点挑战. 许多开发人员依靠像Alamofire和SDWebIm ...
- 零基础理解什么是API(网络请求)
没有学编程之前我以为是精酿啤酒的一种,IPA 啤酒即印度爱尔啤酒. 一个码农第一次去酒吧点酒,老板,给我来一杯API,恰好老板是从程序员转行开酒馆,老板抛给你一个404,这个时候第一次去酒吧的码农就尴 ...
- Android 利用an框架快速实现网络请求(含下载上传文件)
作者:Bgwan 链接:https://zhuanlan.zhihu.com/p/22573081 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. an框架的网络框架 ...
- Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求
Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求 转自 http://www.cocoachina.com/ios/20141202/10390.html 本 ...
- [Swift]Alamofire使用嵌套参数进行网络请求遇到的问题
GitHub: https://github.com/Gamin-fzym/DomainManageDemo 之前封装的网络请求方法,最近发发现有些问题. /// Post请求 /// - Param ...
- Flutter网络请求Dio库的使用及封装
Dart语言内置的HttpClient实现了基本的网络请求相关的操作.但HttpClient本身功能较弱,很多网络请求常用功能都不支持,因此在实际项目中,我们更多是使用dio库实现网络请求. 注:Fl ...
- 流行框架(二)网络请求库 OKhttp
文章目录 概述 HttpURLConnection GET和POST获取文本数据 GET POST OKHttp 基本使用 依赖与权限 发起一个get请求 重要概念 OkHttpClient Requ ...
最新文章
- C语言中sizeof与strlen的区别总结!
- 【漫谈数据仓库】 如何优雅地设计数据分层
- 数据结构系统学习(1)数据类型和数据结构的概念
- utf-8、unicode区别与联系
- 把自定义类实例存储到LSO
- java领域模型设计实例_Java 开发架构篇:DDD 模型领域层决策规则树服务设计
- CCF专区推荐重点SCI期刊征稿中~
- 大数据学习入门必备规划
- vsto excel决跨表引用值不能更新的问题
- 在线工具(eda/画图[visio替代]/公式编辑/公式识别)
- php杨辉三角的规律,杨辉三角的规律以及定理
- 重磅出击: Rancher 2.4.x 迁移自定义 k8s 集群
- MatlabR2012a 显示使用过期的注册文件破解(.lic)
- Greenplum 实时数据仓库实践(1)——数据仓库简介
- iosetup mysql_InnoDB:Error:io_setup()failedwithEAGAIN
- 微信小程序原生上传图片封装
- 【P1889 士兵站队】(洛谷)
- spring——Spring自动装配——示例
- UML中的九种建模图
- 万一的 Delphi 博客 (注意 delphi的新功能)