diff --git a/Sources/Action/Action.swift b/Sources/Action/Action.swift index 92430bb3..09aa94ab 100644 --- a/Sources/Action/Action.swift +++ b/Sources/Action/Action.swift @@ -95,6 +95,7 @@ public final class Action { elements = executionObservables .flatMap { $0.catch { _ in Observable.empty() } } + .share() executing = executionObservables.flatMap { execution -> Observable in @@ -113,6 +114,10 @@ public final class Action { .combineLatest(executing, enabledIf) { !$0 && $1 } .bind(to: enabledSubject) .disposed(by: disposeBag) + + elements + .subscribe() + .disposed(by: disposeBag) } @discardableResult diff --git a/Tests/ActionTests.swift b/Tests/ActionTests.swift index b61a548b..ed37f1bf 100644 --- a/Tests/ActionTests.swift +++ b/Tests/ActionTests.swift @@ -46,8 +46,8 @@ class ActionTests: QuickSpec { let completions = scheduler.createObserver(Void.self) action.completions.bind(to: completions).disposed(by: disposeBag) scheduler.start() - expect(completions.events.contains { $0.time == 10}).to(beTrue()) - expect(completions.events.contains { $0.time == 20}).to(beTrue()) + expect(completions.events.contains { $0.time == 10 }).to(beTrue()) + expect(completions.events.contains { $0.time == 20 }).to(beTrue()) } } @@ -520,6 +520,49 @@ class ActionTests: QuickSpec { expect(executionObservables.events.count).to(match(1)) } } + + context("subscribe elements while executing") { + var trigger: PublishSubject! + + beforeEach { + trigger = PublishSubject() + action = Action { Observable.just($0).sample(trigger) } + + action.executionObservables + .bind(to: executionObservables) + .disposed(by: disposeBag) + + scheduler.scheduleAt(10) { + Observable.just("a") + .bind(to: action.inputs) + .disposed(by: disposeBag) + } + + scheduler.scheduleAt(20) { + action.elements + .bind(to: element) + .disposed(by: disposeBag) + } + + scheduler.scheduleAt(30) { + #if swift(>=3.2) + trigger.onNext(()) + #else + trigger.onNext() + #endif + } + + scheduler.start() + } + + it("elements receives value") { + expect(element.events).to(match(Recorded.events([.next(30, "a")]))) + } + + it("executes once") { + expect(executionObservables.events.count).to(match(1)) + } + } } } }