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 简单的异步示例?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxSwift 异步加载 UITableView 单元格

使用 RxSwift 同步异步网络调用

使用 RxSwift 的反应式异步反馈系统

使用 RxSwift 的异步任务和多个观察者

未调用 RxSwift 订阅块

RxSwift - 执行控制流会导致异步操作被执行两次