Skip to content

Commit 84275dc

Browse files
committed
Change dispatchQueue delivery from Store to ObservableProperty deliverOn(_:) function
1 parent f56da34 commit 84275dc

File tree

7 files changed

+37
-52
lines changed

7 files changed

+37
-52
lines changed

ReactiveReSwift.xcodeproj/project.pbxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
9E1F6F4E1DE7D15200912955 /* StoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F411DE7D15200912955 /* StoreTests.swift */; };
4646
9E1F6F4F1DE7D15200912955 /* StoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F411DE7D15200912955 /* StoreTests.swift */; };
4747
9E1F6F501DE7D15200912955 /* StoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F411DE7D15200912955 /* StoreTests.swift */; };
48-
9E1F6F571DE7D15200912955 /* RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F441DE7D15200912955 /* RxTests.swift */; };
49-
9E1F6F581DE7D15200912955 /* RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F441DE7D15200912955 /* RxTests.swift */; };
50-
9E1F6F591DE7D15200912955 /* RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F441DE7D15200912955 /* RxTests.swift */; };
48+
9E1F6F571DE7D15200912955 /* ReactiveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F441DE7D15200912955 /* ReactiveTests.swift */; };
49+
9E1F6F581DE7D15200912955 /* ReactiveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F441DE7D15200912955 /* ReactiveTests.swift */; };
50+
9E1F6F591DE7D15200912955 /* ReactiveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1F6F441DE7D15200912955 /* ReactiveTests.swift */; };
5151
9E1F6F6B1DECFFCA00912955 /* ReactiveReSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 625E66861C1FF97E0027C288 /* ReactiveReSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
5252
9E1F6F6C1DECFFCC00912955 /* ReactiveReSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 625E66861C1FF97E0027C288 /* ReactiveReSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
5353
9E1F6F6D1DECFFCF00912955 /* ReactiveReSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 625E66861C1FF97E0027C288 /* ReactiveReSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -126,7 +126,7 @@
126126
9E1F6F3F1DE7D15200912955 /* StoreDispatchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StoreDispatchTests.swift; path = Observable/StoreDispatchTests.swift; sourceTree = "<group>"; };
127127
9E1F6F401DE7D15200912955 /* StoreMiddlewareTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StoreMiddlewareTests.swift; path = Observable/StoreMiddlewareTests.swift; sourceTree = "<group>"; };
128128
9E1F6F411DE7D15200912955 /* StoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StoreTests.swift; path = Observable/StoreTests.swift; sourceTree = "<group>"; };
129-
9E1F6F441DE7D15200912955 /* RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RxTests.swift; path = Observable/RxTests.swift; sourceTree = "<group>"; };
129+
9E1F6F441DE7D15200912955 /* ReactiveTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReactiveTests.swift; path = Observable/ReactiveTests.swift; sourceTree = "<group>"; };
130130
9E1F6F7F1DED0CB000912955 /* SubscriptionReferenceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscriptionReferenceType.swift; sourceTree = "<group>"; };
131131
9E1F6F841DED0CEA00912955 /* ObservableProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObservableProperty.swift; sourceTree = "<group>"; };
132132
9E1F6F891DED0D1100912955 /* ObservablePropertySubscriptionReference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObservablePropertySubscriptionReference.swift; sourceTree = "<group>"; };
@@ -232,7 +232,7 @@
232232
625E669E1C1FFA3C0027C288 /* Info.plist */,
233233
621C06851C277759008029AE /* ReducerTests.swift */,
234234
9E1F6F251DE7C01F00912955 /* MiddlewareFakes.swift */,
235-
9E1F6F441DE7D15200912955 /* RxTests.swift */,
235+
9E1F6F441DE7D15200912955 /* ReactiveTests.swift */,
236236
9E1F6F3F1DE7D15200912955 /* StoreDispatchTests.swift */,
237237
9E1F6F401DE7D15200912955 /* StoreMiddlewareTests.swift */,
238238
9E1F6F411DE7D15200912955 /* StoreTests.swift */,
@@ -619,7 +619,7 @@
619619
9E1F6F4A1DE7D15200912955 /* StoreDispatchTests.swift in Sources */,
620620
9E1F6F501DE7D15200912955 /* StoreTests.swift in Sources */,
621621
25DBCF731C30C34000D63A58 /* ReducerTests.swift in Sources */,
622-
9E1F6F591DE7D15200912955 /* RxTests.swift in Sources */,
622+
9E1F6F591DE7D15200912955 /* ReactiveTests.swift in Sources */,
623623
25DBCF751C30C34000D63A58 /* TestFakes.swift in Sources */,
624624
);
625625
runOnlyForDeploymentPostprocessing = 0;
@@ -651,7 +651,7 @@
651651
9E1F6F491DE7D15200912955 /* StoreDispatchTests.swift in Sources */,
652652
9E1F6F4F1DE7D15200912955 /* StoreTests.swift in Sources */,
653653
25DBCF9E1C30C50000D63A58 /* ReducerTests.swift in Sources */,
654-
9E1F6F581DE7D15200912955 /* RxTests.swift in Sources */,
654+
9E1F6F581DE7D15200912955 /* ReactiveTests.swift in Sources */,
655655
25DBCFA01C30C50000D63A58 /* TestFakes.swift in Sources */,
656656
);
657657
runOnlyForDeploymentPostprocessing = 0;
@@ -683,7 +683,7 @@
683683
9E1F6F261DE7C01F00912955 /* MiddlewareFakes.swift in Sources */,
684684
9E1F6F481DE7D15200912955 /* StoreDispatchTests.swift in Sources */,
685685
9E1F6F4E1DE7D15200912955 /* StoreTests.swift in Sources */,
686-
9E1F6F571DE7D15200912955 /* RxTests.swift in Sources */,
686+
9E1F6F571DE7D15200912955 /* ReactiveTests.swift in Sources */,
687687
621C06861C277759008029AE /* ReducerTests.swift in Sources */,
688688
);
689689
runOnlyForDeploymentPostprocessing = 0;

Sources/CoreTypes/Store.swift

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,19 @@ open class Store<ObservableProperty: ObservablePropertyType> where ObservablePro
2525
public var dispatchMiddleware: Middleware<ObservableProperty.ValueType>!
2626
private var reducer: StoreReducer
2727
public var observable: ObservableProperty!
28-
private let dispatchQueue: DispatchQueue
2928
private var disposeBag = SubscriptionReferenceBag()
3029

3130
public required init(reducer: StoreReducer,
3231
observable: ObservableProperty,
33-
middleware: StoreMiddleware = Middleware(),
34-
dispatchQueue: DispatchQueue = DispatchQueue.main) {
32+
middleware: StoreMiddleware = Middleware()) {
3533
self.reducer = reducer
3634
self.observable = observable
3735
self.dispatchMiddleware = middleware
38-
self.dispatchQueue = dispatchQueue
3936
}
4037

4138
private func defaultDispatch(action: Action) {
42-
dispatchQueue.sync {
43-
let value = self.reducer.transform(action, self.observable.value)
44-
self.observable.value = value
45-
}
39+
let value = self.reducer.transform(action, self.observable.value)
40+
self.observable.value = value
4641
}
4742

4843
public func dispatch(_ actions: Action...) {

Sources/Reactive/ObservableProperty.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ public class ObservableProperty<ValueType>: ObservablePropertyType {
1818
private var subscriptionToken: Int = 0
1919
private var retainReference: ObservableProperty<ValueType>?
2020
fileprivate var disposeBag = SubscriptionReferenceBag()
21+
private var queue: DispatchQueue?
2122
public var value: ValueType {
2223
didSet {
23-
subscriptions.forEach { $0.value(value) }
24+
let closure = {
25+
self.subscriptions.forEach { $0.value(self.value) }
26+
}
27+
queue?.async(execute: closure) ?? closure()
2428
}
2529
}
2630

@@ -56,6 +60,12 @@ public class ObservableProperty<ValueType>: ObservablePropertyType {
5660
return property
5761
}
5862

63+
public func deliveredOn(_ queue: DispatchQueue) -> ObservableProperty<ValueType> {
64+
let property = map({ $0 })
65+
property.queue = queue
66+
return property
67+
}
68+
5969
internal func unsubscribe(reference: ObservablePropertySubscriptionReferenceType) {
6070
subscriptions.removeValue(forKey: reference)
6171
if subscriptions.isEmpty {

Tests/Observable/RxTests.swift renamed to Tests/Observable/ReactiveTests.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
@testable import ReactiveReSwift
1010
import XCTest
1111

12-
class RxTests: XCTestCase {
12+
class ReactiveTests: XCTestCase {
1313

1414
func testObservablePropertySendsNewValues() {
1515
let values = (10, 20, 30)
@@ -62,7 +62,7 @@ class RxTests: XCTestCase {
6262
}
6363

6464
func testSubscriptionBagDisposesOfReferences() {
65-
let property = ObservableProperty(())
65+
let property = ObservableProperty(()).deliveredOn(DispatchQueue.global())
6666
let bag = SubscriptionReferenceBag(property.subscribe({}))
6767
bag += property.subscribe({})
6868
XCTAssertEqual(property.subscriptions.count, 2)
@@ -76,5 +76,4 @@ class RxTests: XCTestCase {
7676
reference?.dispose()
7777
reference?.dispose()
7878
}
79-
8079
}

Tests/Observable/StoreDispatchTests.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,9 @@ class ObservableStoreDispatchTests: XCTestCase {
3030
func testLiftingWorksAsExpected() {
3131
let property = ObservableProperty(SetValueAction(10))
3232
store = Store(reducer: reducer,
33-
observable: ObservableProperty(TestAppState()),
34-
dispatchQueue: dispatchQueue)
33+
observable: ObservableProperty(TestAppState()))
3534
store.dispatch(property)
3635
property.value = SetValueAction(20)
37-
dispatchQueue.sync {
38-
XCTAssertEqual(store.observable.value.testValue, 20)
39-
}
36+
XCTAssertEqual(store.observable.value.testValue, 20)
4037
}
4138
}

Tests/Observable/StoreMiddlewareTests.swift

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,15 @@ class StoreMiddlewareTests: XCTestCase {
1919
func testDecorateDispatch() {
2020
let store = Store(reducer: testValueStringReducer,
2121
observable: ObservableProperty(TestStringAppState()),
22-
middleware: Middleware(firstMiddleware, secondMiddleware),
23-
dispatchQueue: dispatchQueue)
22+
middleware: Middleware(firstMiddleware, secondMiddleware))
2423

2524
let subscriber = TestStoreSubscriber<TestStringAppState>()
2625
store.observable.subscribe(subscriber.subscription)
2726

2827
let action = SetValueStringAction("OK")
2928
store.dispatch(action)
3029

31-
dispatchQueue.sync {
32-
XCTAssertEqual(store.observable.value.testValue, "OK First Middleware Second Middleware")
33-
}
30+
XCTAssertEqual(store.observable.value.testValue, "OK First Middleware Second Middleware")
3431
}
3532

3633
/**
@@ -39,18 +36,15 @@ class StoreMiddlewareTests: XCTestCase {
3936
func testCanDispatch() {
4037
let store = Store(reducer: testValueStringReducer,
4138
observable: ObservableProperty(TestStringAppState()),
42-
middleware: Middleware(firstMiddleware, secondMiddleware, dispatchingMiddleware).flatMap { $1 },
43-
dispatchQueue: dispatchQueue)
39+
middleware: Middleware(firstMiddleware, secondMiddleware, dispatchingMiddleware).flatMap { $1 })
4440

4541
let subscriber = TestStoreSubscriber<TestStringAppState>()
4642
store.observable.subscribe(subscriber.subscription)
4743

4844
let action = SetValueAction(10)
4945
store.dispatch(action)
5046

51-
dispatchQueue.sync {
52-
XCTAssertEqual(store.observable.value.testValue, "10 First Middleware Second Middleware")
53-
}
47+
XCTAssertEqual(store.observable.value.testValue, "10 First Middleware Second Middleware")
5448
}
5549

5650
/**
@@ -60,14 +54,11 @@ class StoreMiddlewareTests: XCTestCase {
6054
let property = ObservableProperty(TestStringAppState(testValue: "OK"))
6155
let store = Store(reducer: testValueStringReducer,
6256
observable: property,
63-
middleware: stateAccessingMiddleware,
64-
dispatchQueue: dispatchQueue)
57+
middleware: stateAccessingMiddleware)
6558

6659
store.dispatch(SetValueStringAction("Action That Won't Go Through"))
6760

68-
dispatchQueue.sync {
69-
XCTAssertEqual(store.observable.value.testValue, "Not OK")
70-
}
61+
XCTAssertEqual(store.observable.value.testValue, "Not OK")
7162
}
7263

7364
/**
@@ -103,11 +94,8 @@ class StoreMiddlewareTests: XCTestCase {
10394
let property = ObservableProperty(CounterState(count: 0))
10495
let store = Store(reducer: increaseByOneReducer,
10596
observable: property,
106-
middleware: multiplexingMiddleware,
107-
dispatchQueue: dispatchQueue)
97+
middleware: multiplexingMiddleware)
10898
store.dispatch(NoOpAction())
109-
dispatchQueue.sync {
110-
XCTAssertEqual(store.observable.value.count, 3)
111-
}
99+
XCTAssertEqual(store.observable.value.count, 3)
112100
}
113101
}

Tests/Observable/StoreTests.swift

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,18 @@ class DeInitStore<State: StateType>: Store<ObservableProperty<State>> {
3939
convenience init(reducer: Reducer<ObservableProperty<State>.ValueType>,
4040
observable: ObservableProperty<State>,
4141
middleware: Middleware<ObservableProperty<State>.ValueType> = Middleware(),
42-
dispatchQueue: DispatchQueue = DispatchQueue.main,
4342
deInitAction: @escaping () -> Void) {
4443
self.init(reducer: reducer,
4544
observable: observable,
46-
middleware: middleware,
47-
dispatchQueue: dispatchQueue)
45+
middleware: middleware)
4846
self.deInitAction = deInitAction
4947
}
5048

5149
required init(reducer: Reducer<ObservableProperty<State>.ValueType>,
5250
observable: ObservableProperty<State>,
53-
middleware: Middleware<ObservableProperty<State>.ValueType>,
54-
dispatchQueue: DispatchQueue) {
51+
middleware: Middleware<ObservableProperty<State>.ValueType>) {
5552
super.init(reducer: reducer,
5653
observable: observable,
57-
middleware: middleware,
58-
dispatchQueue: dispatchQueue)
54+
middleware: middleware)
5955
}
6056
}

0 commit comments

Comments
 (0)