From 74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76 Mon Sep 17 00:00:00 2001 From: Aleksei Minaev Date: Thu, 14 Mar 2019 16:12:17 +0100 Subject: [PATCH 1/2] Update order of invocation in sendNext: RACReplaySubject valuesReceived should be cleaned up before sending value. If we have subscription and creating another subscription on the same RACReplaySubject while -take:1 it - we can get first value instead of second. --- ReactiveObjC/RACReplaySubject.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReactiveObjC/RACReplaySubject.m b/ReactiveObjC/RACReplaySubject.m index 30475fa9e..ee97ff9e9 100644 --- a/ReactiveObjC/RACReplaySubject.m +++ b/ReactiveObjC/RACReplaySubject.m @@ -85,11 +85,12 @@ - (RACDisposable *)subscribe:(id)subscriber { - (void)sendNext:(id)value { @synchronized (self) { [self.valuesReceived addObject:value ?: RACTupleNil.tupleNil]; - [super sendNext:value]; if (self.capacity != RACReplaySubjectUnlimitedCapacity && self.valuesReceived.count > self.capacity) { [self.valuesReceived removeObjectsInRange:NSMakeRange(0, self.valuesReceived.count - self.capacity)]; } + + [super sendNext:value]; } } From 35aa8e4d89da018d158d126c944a38d16ac18581 Mon Sep 17 00:00:00 2001 From: Aleksei Minaev Date: Thu, 28 Mar 2019 10:16:06 +0100 Subject: [PATCH 2/2] Add test for ReplaySubject that returns correct values while subscription is made in another subscription --- ReactiveObjCTests/RACSubjectSpec.m | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ReactiveObjCTests/RACSubjectSpec.m b/ReactiveObjCTests/RACSubjectSpec.m index 3a5766a8b..bfe56a5b5 100644 --- a/ReactiveObjCTests/RACSubjectSpec.m +++ b/ReactiveObjCTests/RACSubjectSpec.m @@ -96,6 +96,21 @@ - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable { qck_beforeEach(^{ subject = [RACReplaySubject replaySubjectWithCapacity:1]; }); + + qck_it(@"should send same latest value to multiple subscribers in another subscription", ^{ + __block NSMutableArray *values = [NSMutableArray array]; + + [subject subscribeNext:^(id _Nullable item1) { + [values addObject:item1]; + [[subject take:1] subscribeNext:^(id _Nullable item2) { + [values addObject:item2]; + }]; + }]; + [subject sendNext:@1]; + [subject sendNext:@2]; + + expect(values).to(equal(@[@1, @1, @2, @2])); + }); qck_it(@"should send the last value", ^{ id firstValue = @"blah";