http://blog.csdn.net/hbblzjy/article/details/53392135


1、什么是Alamofire

(1) Alamofire的前身是 AFNetworkingAFNetworkingiOSOS 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,parameters: paramsDic)
带有编码方式的请求:
Alamofire .request(urlStr ,parameters: paramsDic, encoding: JSONEncoding . default )
带有请求头的请求:
let headers: HTTPHeaders = [
"Authorization" : "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" ,
"Accept" : "application/json"
]
Alamofire .request(urlStr , encoding: JSONEncoding . default ,headers:HTTPHeaders)
响应处理方法:Alamofire还提供了许多响应处理方法:
response()
responseData()
responseString(encoding: nsstringencoding)
responseJSON(options: NSJSONReadingOptions)
responsePropertyList(options: nspropertyListReadOptions)
直接在上面的请求方式后面调用方法,如:
Alamofire.request(urlStr,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,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. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  3. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  4. ios – bug编译alamofire – 未知选项字符`X’: – Xlinker

    尝试使用cocoapods将alamofire添加到项目中.Xcode版本:6.1.1版Podfile:这是错误:解决方法通过升级到Cocoapods0.36beta解决了这个问题.我也不得不删除旧版本.

  5. ios – “没有这样的模块’Alamofire’”将无法识别框架

    我正在尝试使用Swift将Alamofire添加到一个新的XCode项目中.我觉得我已经尝试了一切.每次我尝试添加进口Alamofire我得到“没有这样的模块”.我已按照https://github.com/Alamofire/Alamofire所述尝试安装,我尝试先手动完成,然后是Carthage和Cocoapods,但结果相同.我已经尝试删除DerivedData文件夹并重建项目,没有任何运气

  6. xcode – tvos:Alamofire框架的iTunesConnect验证失败:不包含bitcode

    解决方法我想你是在项目设置中用appletvsimulator提交Framework.检查此链接Carthageissue

  7. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  8. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  9. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  10. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部