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