前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxSwift如何避免回调地狱

RxSwift如何避免回调地狱

作者头像
全栈程序员站长
发布2022-07-21 13:53:37
5120
发布2022-07-21 13:53:37
举报

大家好,又见面了,我是你们的朋友全栈君。

首先看如何制造回调地狱:

代码语言:swift
复制
func fetchData(_ f: (String) -> Void) -> Void {
    f("1")
}

fetchData { (result) in
    print(result)
}
复制代码

那么可以总结出回调地狱的规则为:

(T -> ()) -> ()

如何避免回调地狱:单子的模型(简)

代码语言:swift
复制
struct Monad<T> {
    var value: T
    func flatMap<U>(_ f: (T) -> Monad<U>) -> Monad<U> {
        return f(value)
    }
}

let monad = Monad(value: 10)
let result = monad
    .flatMap ({
        return Monad(value: String($0)) // "10"
    })
    .flatMap({
        return Monad(value: Float($0)! + 5) // 10.0 + 5
    })

result.value // 15
复制代码

所以单子模型的关键函数flatMap可以抽象成:

(T -> F(U)) -> F(U)

最后用RxSwift实现

代码语言:swift
复制
func fetchData() -> Observable<String> {
    return Observable<String>.create { observer in
        DispatchQueue.global().async {
            sleep(1)
            DispatchQueue.main.async {
                observer.onNext("1")
            }
        }
        return Disposables.create()
    }
}
    
func convertToInt(source: String) -> Observable<Int> {
    return Observable<Int>.create { observer in
        let result = Int(source) ?? 0
        observer.onNext(result)
        return Disposables.create()
    }
}
    
func convertToBool(source: Int) -> Observable<Bool> {
    return Observable<Bool>.create { observer in
        let result = source > 0 ? true : false
        observer.onNext(result)
        return Disposables.create()
    }
}
复制代码

要实现单子就返回Observable即可。

产生回调地狱的调用方式(简化):

代码语言:swift
复制
fetchData().subscribe(onNext: {
    self.convertToInt(source: $0).subscribe(onNext: {
        self.convertToBool(source: $0).subscribe(onNext: {
            print("final result: \($0)")
        })
    })
})
复制代码

不产生回调地狱(单子)的方式(简化):

代码语言:swift
复制
self.fetchData()
    .flatMap({
        return self.convertToInt(source: $0)
    })
    .flatMap({
        return self.convertToBool(source: $0)
    })
    .subscribe(onNext: {
        print("final result:\($0)")
    })
复制代码

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/107413.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月3,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档