RxSwift 這個(gè)框架看我就夠了冰沙,這一篇我重點(diǎn)介紹
RxSwift
對(duì)網(wǎng)絡(luò)層的封裝。搞RxSwift
举塔,我是認(rèn)真的
RxSwift 寶圖鎮(zhèn)博,咔咔點(diǎn)贊~~~~
Rxswift
-
RxSwift 深入淺出(一)RxSwift初探
-
RxSwift 深入淺出(二)高階函數(shù)
-
RxSwift 深入淺出(三)Subject
-
RxSwift 深入淺出(四)控件應(yīng)用
-
RxSwift 深入淺出(五)tableView應(yīng)用
-
RxSwift 深入淺出(六)RxDataSources
-
RxSwift 深入淺出(七)網(wǎng)絡(luò)封裝
-
RxSwift 深入淺出(八)開(kāi)發(fā)總結(jié)
對(duì)于一個(gè)強(qiáng)大的框架鞠柄,肯定不會(huì)放過(guò)繁重網(wǎng)絡(luò)層的編寫(xiě)對(duì)開(kāi)發(fā)者造成的傷害
import UIKit
import RxCocoa
import RxSwift
class RxSwiftNetVC: UIViewController{
let surStr = "https://www.douban.com/j/app/radio/channels"
let disposeB = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(pushNewSearchVC))
self.title = "RxNetworkDemo";
self.view.backgroundColor = UIColor.orange
testResponse()
testData()
testJson()
}
func testResponse(){
let url = URL(string:surStr)
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response,data) in
print("***************response******************")
print("response == \(response) \n data = \(data)")
}, onError: { (error) in
print(error)
})
.disposed(by: disposeB)
}
func testData(){
let url = URL(string:surStr)
URLSession.shared.rx.data(request: URLRequest(url: url!))
.subscribe(onNext: { (data) in
print("***************data******************")
print("data = \(data)")
}, onError: { (error) in
print(error)
})
.disposed(by: disposeB)
}
func testJson(){
let url = URL(string:surStr)
URLSession.shared.rx.json(url: url!)
.subscribe(onNext: { (jsonData) in
print("***************jsonData******************")
print("jsonData = \(jsonData)")
}, onError: { (error) in
print(error)
})
.disposed(by: disposeB)
}
@objc func pushNewSearchVC(){
self.navigationController?.pushViewController(RxSwiftNetVC(), animated: true)
}
}
看著使用賊輕便,賊簡(jiǎn)單停巷,是不是感覺(jué)會(huì)上癮,下面我們來(lái)看看源碼
public func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {
return Observable.create { observer in
// smart compiler should be able to optimize this out
let d: Date?
if Logging.URLRequests(request) {
d = Date()
}
else {
d = nil
}
let task = self.base.dataTask(with: request) { (data, response, error) in
if Logging.URLRequests(request) {
let interval = Date().timeIntervalSince(d ?? Date())
print(convertURLRequestToCurlCommand(request))
#if os(Linux)
print(convertResponseToString(response, error.flatMap { $0 as? NSError }, interval))
#else
print(convertResponseToString(response, error.map { $0 as NSError }, interval))
#endif
}
guard let response = response, let data = data else {
observer.on(.error(error ?? RxCocoaURLError.unknown))
return
}
guard let httpResponse = response as? HTTPURLResponse else {
observer.on(.error(RxCocoaURLError.nonHTTPResponse(response: response)))
return
}
observer.on(.next((httpResponse, data)))
observer.on(.completed)
}
task.resume()
return Disposables.create(with: task.cancel)
}
}
驚嘆,牛逼畔勤,對(duì)
URLSession
做了分類(lèi)處理蕾各,封裝了一套request,task
public func data(request: URLRequest) -> Observable<Data> {
return response(request: request).map { pair -> Data in
if 200 ..< 300 ~= pair.0.statusCode {
return pair.1
}
else {
throw RxCocoaURLError.httpRequestFailed(response: pair.0, data: pair.1)
}
}
}
就是對(duì)response
方法的封裝
public func json(request: URLRequest, options: JSONSerialization.ReadingOptions = []) -> Observable<Any> {
return data(request: request).map { (data) -> Any in
do {
return try JSONSerialization.jsonObject(with: data, options: options)
} catch let error {
throw RxCocoaURLError.deserializationError(error: error)
}
}
}
就是對(duì)data
方法的封裝