RxSwift (retry, catchErrorJustReturn)用法

為了更加好的表現(xiàn)retry和catchErrorJustReturn的用法我們先用node.js寫(xiě)一個(gè)返回JSON的server.js。

var http = require("http");

var body = {
    "data": {
        "userName": "Bartholomew大熊"
    }
}
var bodyString = JSON.stringify(body);

http.createServer(function (request, response) {

    response.writeHead(200, {'Content-Type': 'text/json'});
    response.write(bodyString)
    response.end();

}).listen(8888);

console.log('Server running at http://127.0.0.1:8888/')

然后在終端 node server.js運(yùn)行起來(lái)
然后就是swift代碼

/**
 *  一旦序列里產(chǎn)出了一個(gè)error事件,整個(gè)序列將被終止。RxSwift主要有兩種錯(cuò)誤處理機(jī)制
 *  1.retry - 可以讓序列在發(fā)生錯(cuò)誤后重試
 *  2.catch - 可以在錯(cuò)誤產(chǎn)生時(shí),用一個(gè)備用元素或者一組備用元素將錯(cuò)誤替換掉
 */

import Foundation
import UIKit
import RxSwift
import RxCocoa

typealias JSON = Any

struct ClassErrorHandling {
    private static let bag = DisposeBag()
    
    static func action() {
        //retry()
        catchError()
    }
    
    // retry
    private static func retry() {
        
        let json: Observable<JSON> = Observable<JSON>.create { (observer) -> Disposable in
            
            let dataTask = URLSession.shared.dataTask(with: URL(string: "http://127.0.0.1:8888/")!, completionHandler: { (data, response, error) in
                guard error == nil else {
                    observer.onError(error!)
                    return
                }
                guard let data = data, let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) else {
                    observer.onError(CustomError.error)
                    return
                }
                observer.onNext(jsonObject)
                observer.onCompleted()
                
            })
            dataTask.resume()
            return Disposables.create()
        }
        
        json
            .retry(2)
            .subscribe(onNext: { json in
                print("success = \(json)")
            }, onError: { error in
                print("error = \(error)")
            }, onCompleted: {
                print("completed")
            })
            .disposed(by: bag)
    }
    
    // catch
    private static func catchError() {
        let json: Observable<JSON> = Observable<JSON>.create { (observer) -> Disposable in
            
            let dataTask = URLSession.shared.dataTask(with: URL(string: "http://127.0.0.1:8888/")!, completionHandler: { (data, response, error) in
                guard error == nil else {
                    observer.onError(error!)
                    return
                }
                guard let data = data, let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) else {
                    observer.onError(CustomError.error)
                    return
                }
                observer.onNext(jsonObject)
                observer.onCompleted()
                
            })
            dataTask.resume()
            return Disposables.create()
        }
        
        json
            .catchErrorJustReturn(["data": "9000"])
            .subscribe(onNext: { json in
                print("success = \(json)")
            }, onError: { error in
                print("error = \(error)")
            }, onCompleted: {
                print("completed")
            })
            .disposed(by: bag)
    }
    
}
  • 運(yùn)行之后就能看到retry和catchErrorJustReturn的表現(xiàn)方式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,200評(píng)論 4 61
  • 有胃腸炎的人應(yīng)選用易消化、含足夠熱量、蛋白質(zhì)和維生素豐富的食物。如稀飯、細(xì)面條、軟米飯、豆?jié){、雞蛋、瘦肉、豆...
    感謝過(guò)去閱讀 383評(píng)論 0 0
  • 我是一個(gè)看不得有關(guān)親情故事的姑娘,因?yàn)樵陂e下來(lái)的每一刻我都想盡辦法要回到家人身邊,結(jié)果也總不如我所想。有時(shí)候偏就是...
    SkyVivian閱讀 245評(píng)論 0 0
  • “認(rèn)真的男人最可怕”是的,吳京他就是這樣的人,不論是《戰(zhàn)狼1》還是《戰(zhàn)狼2》吳京他都在用生命演出。他的認(rèn)真...
    靈蘭碎雨閱讀 348評(píng)論 0 0