? ? ? ? 在之前的兩篇文章中,我介紹了 RxSwift
對 URLSession
的擴展以及使用。當然除了可以使用 URLSession
進行網絡請求外,網上還有許多優秀的第三方網絡庫也可以與 RxSwift
結合使用的,比如:RxAlamofire
和 Moya
。這次我先介紹下前者。
一 、安裝配置
1,引入 Alamofire
由于 RxAlamofire
是對 Alamofire
的封裝,所以我們項目中先要把 Alamofire
庫給引入進來。關于 Alamofire
的安裝配置可以參考航哥之前的文章:
2,添加 RxAlamofire
(1)這里我使用手動配置的方式,先把 RxAlamofire
庫下載到本地。
(2)接著把里面的 RxAlamofire.swift
文件添加到我們的項目中即可。
二、基本用法
1,使用 request 請求數據
(1)下面代碼我們通過豆瓣提供的頻道列表接口獲取數據,并將返回結果輸出到控制臺中。
//創建URL對象
let urlString = "https://www.douban.com/j/app/radio/channels"
let url = URL(string:urlString)!
//創建并發起請求
request(.get, url)
.data()
.subscribe(onNext: {
data in
//數據處理
let str = String(data: data, encoding: String.Encoding.utf8)
print("返回的數據是:", str ?? "")
}).disposed(by: disposeBag)
(2)如果還要處理失敗的情況,可以在 onError
回調中操作。我們把 url
改成一個錯誤的地址,運行結果如下:
//創建URL對象
let urlString = "https://www.douban.com/jxxxxxxxx/app/radio/channels"
let url = URL(string:urlString)!
//創建并發起請求
request(.get, url)
.data()
.subscribe(onNext: {
data in
//數據處理
let str = String(data: data, encoding: String.Encoding.utf8)
print("返回的數據是:", str ?? "")
}, onError: { error in
print("請求失敗!錯誤原因:", error)
}).disposed(by: disposeBag)
2,使用 requestData 請求數據
(1)下面代碼同樣是獲取豆瓣頻道數據,并將返回結果輸出到控制臺中。
//創建URL對象
let urlString = "https://www.douban.com/j/app/radio/channels"
let url = URL(string:urlString)!
//創建并發起請求
requestData(.get, url).subscribe(onNext: {
response, data in
//數據處理
let str = String(data: data, encoding: String.Encoding.utf8)
print("返回的數據是:", str ?? "")
}).disposed(by: disposeBag)
(2)使用 requestData
的話,不管請求成功與否都會進入到 onNext
這個回調中。如果我們想要根據響應狀態進行一些相應操作,通過 response
參數即可實現。
//創建URL對象
let urlString = "https://www.douban.com/jxxxxxxx/app/radio/channels"
let url = URL(string:urlString)!
//創建并發起請求
requestData(.get, url).subscribe(onNext: {
response, data in
//判斷響應結果狀態碼
if 200 ..< 300 ~= response.statusCode {
let str = String(data: data, encoding: String.Encoding.utf8)
print("請求成功!返回的數據是:", str ?? "")
}else{
print("請求失敗!")
}
}).disposed(by: disposeBag)
3,獲取 String 類型數據
(1)如果請求的數據是字符串類型的,我們可以在 request
請求時直接通過 responseString()
方法實現自動轉換,省的在回調中還要手動將 data
轉為 string
。
//創建URL對象
let urlString = "https://www.douban.com/j/app/radio/channels"
let url = URL(string:urlString)!
//創建并發起請求
request(.get, url)
.responseString()
.subscribe(onNext: {
response, data in
//數據處理
print("返回的數據是:", data)
}).disposed(by: disposeBag)
(2)當然更簡單的方法就是直接使用 requestString
去獲取數據。
//創建URL對象
let urlString = "https://www.douban.com/j/app/radio/channels"
let url = URL(string:urlString)!
//創建并發起請求
requestString(.get, url)
.subscribe(onNext: {
response, data in
//數據處理
print("返回的數據是:", data)
}).disposed(by: disposeBag)
三、手動發起請求、取消請求
? ? ? ? 在很多情況下,網絡請求并不是由程序自動發起的。可能需要我們點擊個按鈕,或者切換個標簽時才去請求數據。而且除了可以手動發起請求外,同樣可能還需要能手動取消上一次的網絡請求(如果未完成)。下面通過樣例演示這個功能如何實現。
1,效果圖
(1)每次點擊“發起請求”按鈕則去請求一次數據。
(2)如果請求沒返回時,點擊“取消請求”則可將其取消(取消后即使返回數據也不處理了)。
2,樣例代碼
import UIKit
import RxSwift
import RxCocoa
import Alamofire
class ViewController: UIViewController {
//“發起請求”按鈕
@IBOutlet weak var startBtn: UIButton!
//“取消請求”按鈕
@IBOutlet weak var cancelBtn: UIButton!
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
//創建URL對象
let urlString = "https://www.douban.com/j/app/radio/channels"
let url = URL(string:urlString)!
//發起請求按鈕點擊
startBtn.rx.tap.asObservable()
.flatMap {
request(.get, url).responseString()
.takeUntil(self.cancelBtn.rx.tap) //如果“取消按鈕”點擊則停止請求
}
.subscribe(onNext: {
response, data in
print("請求成功!返回的數據是:", data)
}, onError: { error in
print("請求失敗!錯誤原因:", error)
}).disposed(by: disposeBag)
}
}