RXSwift 简单的异步示例?
Posted
技术标签:
【中文标题】RXSwift 简单的异步示例?【英文标题】:RXSwift simple async example? 【发布时间】:2016-11-25 04:00:55 【问题描述】:我是 RXSwift 的新手,我只是尝试实现一个简单的异步示例
但 subscribe 永远不会被调用。
我想念什么?
let disposeBag = DisposeBag()
Observable<Any>.create
observer in
DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + 3)
observer.onNext("done")
observer.onCompleted()
return Disposables.create()
.subscribe print($0)
.addDisposableTo(disposeBag)
================= 更新======================
我正在尝试做一些更高级的事情,一个允许从以前传递值的链,但结果不是预期的。我想念什么?
输出是
下一步(完成 1 - 完成 2)
我的预期是
下一个(完成 1)
下一步(完成 1 - 完成 2)
完成
class AsyncObject
func asyncTest1() -> Observable<String>
return Observable<String>.create
(o: AnyObserver<String>) -> Disposable in
DispatchQueue.main.asyncAfter(deadline: .now() + 3)
o.onNext("done 1")
o.onCompleted()
return Disposables.create()
func asyncTest2(value: String) -> Observable<String>
return Observable<String>.create
(o: AnyObserver<String>) -> Disposable in
DispatchQueue.main.asyncAfter(deadline: .now() + 1)
o.onNext("\(value) - done 2")
o.onCompleted()
return Disposables.create()
class ViewController: UIViewController
let disposeBag = DisposeBag()
let observer = AsyncObject()
// MARK: Init Methods
override func viewDidLoad()
super.viewDidLoad()
self.observer.asyncTest1()
.flatMap self.observer.asyncTest2(value: $0)
.subscribe print($0)
.addDisposableTo(disposeBag)
【问题讨论】:
【参考方案1】:我认为您可以将其与原始的合并,以达到预期的结果。所以它应该看起来像这样
let test1 = self.observer.asyncTest1()
let test2 = test1.flatMap self.observer.asyncTest2()
Observable
.of(test1, test2)
.merge()
.subscribe print($0)
.addDisposableTo(disposeBag)
【讨论】:
与 test1.concat(test2).subscribe print($0) .addDisposableTo(disposeBag) 有什么不同 哪个更好? 结果和我预期的一样,只是我发现asyncTest1被执行了两次。我希望 asyncTest1 & asyncTest2 只执行一次,可能吗?因为在实际场景中,asyncTest1 可能是登录方法,asyncTest2 可能是访问用户数据的方法。【参考方案2】:得到了 RxSwift Slack @sergdot 的帮助,
let test1 = self.observer.asyncTest1().shareReplay(1)
let test2 = test1.flatMap self.observer.asyncTest2(value: $0)
Observable.of(test1, test2).merge().subscribe
print($0)
或
let test1 = self.observer.asyncTest1().shareReplay(1)
let test2 = test1.flatMap self.observer.asyncTest2(value: $0)
test1.concat(test2).subscribe
print($0)
【讨论】:
以上是关于RXSwift 简单的异步示例?的主要内容,如果未能解决你的问题,请参考以下文章