PatrickSCLin
PatrickSCLin

Reputation: 1449

RXSwift simple async example?

I'm new in RXSwift, I just try to implement a simple async example

but subscribe will never be called.

What I miss ?

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)

================= UPDATE ======================

I'm trying to do something more advanced, a chain which allow pass value from previous, but the result was not expected. what I miss ?

output was

next(done 1 - done 2)

what I expected was

next(done 1)

next(done 1 - done 2)

completed

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)
        
    }

}

Upvotes: 1

Views: 2905

Answers (2)

PatrickSCLin
PatrickSCLin

Reputation: 1449

got help from 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)

}

or

let test1 = self.observer.asyncTest1().shareReplay(1)

let test2 = test1.flatMap { self.observer.asyncTest2(value: $0) }

test1.concat(test2).subscribe {

    print($0)

}

Upvotes: 0

Mostafa Amer
Mostafa Amer

Reputation: 46

I think you can merge this with the original one, to achieve the expected result. So it should look something like this

let test1 = self.observer.asyncTest1()
let test2 = test1.flatMap { self.observer.asyncTest2() }

Observable
    .of(test1, test2)
    .merge()
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

Upvotes: 2

Related Questions