【问题标题】:RXSwift simple async example?RXSwift 简单的异步示例?
【发布时间】: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)
        
    }

}

【问题讨论】:

    标签: swift rx-swift


    【解决方案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)
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多