RxSwift (retry, catchErrorJustReturn)用法

为了更加好的表现retry和catchErrorJustReturn的用法我们先用node.js写一个返回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运行起来
然后就是swift代码

/**
 *  一旦序列里产出了一个error事件,整个序列将被终止。RxSwift主要有两种错误处理机制
 *  1.retry - 可以让序列在发生错误后重试
 *  2.catch - 可以在错误产生时,用一个备用元素或者一组备用元素将错误替换掉
 */

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)
    }
    
}
  • 运行之后就能看到retry和catchErrorJustReturn的表现方式。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,287评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,832评论 4 61
  • 有胃肠炎的人应选用易消化、含足够热量、蛋白质和维生素丰富的食物。如稀饭、细面条、软米饭、豆浆、鸡蛋、瘦肉、豆...
    感谢过去阅读 2,910评论 0 0
  • 我是一个看不得有关亲情故事的姑娘,因为在闲下来的每一刻我都想尽办法要回到家人身边,结果也总不如我所想。有时候偏就是...
    SkyVivian阅读 1,688评论 0 0
  • “认真的男人最可怕”是的,吴京他就是这样的人,不论是《战狼1》还是《战狼2》吴京他都在用生命演出。他的认真...
    靈兰碎雨阅读 2,865评论 0 0

友情链接更多精彩内容