ReactiveObjC icon indicating copy to clipboard operation
ReactiveObjC copied to clipboard

RACMulticastConnection and error handling

Open raduraducu opened this issue 7 years ago • 2 comments

Hello, Using RACMulticastConnection it's quite easy to cache the result of a network request. However I'm having trouble in handling gracefully the following scenario: If the signal completes with error the first new subscription should trigger again the signal, all this in a thread safe manner.

Thanks.

raduraducu avatar May 15 '17 07:05 raduraducu

Hi @raduraducu—it sounds like you may want something like shareWhileActive. It isn't included as a core operator in ReactiveObjC, but should give you similar behavior. It is available in this gist https://gist.github.com/jaredru/5540a15c5a1bdcc31787.

In the scenario you've described, this will have the behavior of interrupting all subscriptions when an error occurs. However, if a new subscription occurs following the error, the request will be retried.

erichoracek avatar May 15 '17 14:05 erichoracek

I've looked at shareWhileActive and it does solve half of the problem. What I want to achieve is something like this:

    __weak typeof(self) welf = self;
    return [[[[RACSignal zip:@[RACObserve(self, completeResult), RACObserve(self, completing)]]
            flattenMap:^id(RACTuple *value) {
                __strong typeof(welf) swelf = welf;
                BOOL completing = [value.second boolValue];
                if (completing) {
                    return [RACObserve(swelf, completeResult) skip:1];
                }
                else {
                    if (!self.completeResult || [self.completeResult isKindOfClass:NSError.class]) {
                        [self completeAgain];
                        return [RACObserve(swelf, completeResult) skip:1];
                    }
                    else {
                        return RACObserve(swelf, completeResult);
                    }
                }
            }] subscribeOn:[RACScheduler mainThreadScheduler]] take:1];

The setting of completing and completeResult also happens on the same (main) scheduler to take care of synchronization issues. Can this be done more nicely?

raduraducu avatar May 17 '17 08:05 raduraducu