diff --git a/SSignalKit/SSignal+Catch.m b/SSignalKit/SSignal+Catch.m index 2387c88946..c25a973412 100644 --- a/SSignalKit/SSignal+Catch.m +++ b/SSignalKit/SSignal+Catch.m @@ -63,6 +63,7 @@ static dispatch_block_t recursiveBlock(void (^block)(dispatch_block_t recurse)) if ([currentShouldRestart boolValue]) { + [currentDisposable setDisposable:nil]; id disposable = [self startWithNext:^(id next) { [subscriber putNext:next]; diff --git a/SSignalKit/SSignal+Meta.m b/SSignalKit/SSignal+Meta.m index 2f0ca89633..ffc7f37e17 100644 --- a/SSignalKit/SSignal+Meta.m +++ b/SSignalKit/SSignal+Meta.m @@ -172,13 +172,13 @@ - (SSignal *)then:(SSignal *)signal { - SDisposableSet *compositeDisposable = [[SDisposableSet alloc] init]; - - SMetaDisposable *currentDisposable = [[SMetaDisposable alloc] init]; - [compositeDisposable add:currentDisposable]; - return [[SSignal alloc] initWithGenerator:^(SSubscriber *subscriber) { + SDisposableSet *compositeDisposable = [[SDisposableSet alloc] init]; + + SMetaDisposable *currentDisposable = [[SMetaDisposable alloc] init]; + [compositeDisposable add:currentDisposable]; + [currentDisposable setDisposable:[self startWithNext:^(id next) { [subscriber putNext:next]; diff --git a/SSignalKit/SSignal+SideEffects.h b/SSignalKit/SSignal+SideEffects.h index 0eead9dcd5..9d47d3a49b 100644 --- a/SSignalKit/SSignal+SideEffects.h +++ b/SSignalKit/SSignal+SideEffects.h @@ -2,6 +2,7 @@ @interface SSignal (SideEffects) +- (SSignal *)onStart:(void (^)())f; - (SSignal *)onNext:(void (^)(id next))f; - (SSignal *)afterNext:(void (^)(id next))f; - (SSignal *)onError:(void (^)(id error))f; diff --git a/SSignalKit/SSignal+SideEffects.m b/SSignalKit/SSignal+SideEffects.m index e5531ca67d..4a7e992826 100644 --- a/SSignalKit/SSignal+SideEffects.m +++ b/SSignalKit/SSignal+SideEffects.m @@ -5,6 +5,24 @@ @implementation SSignal (SideEffects) +- (SSignal *)onStart:(void (^)())f +{ + return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) + { + f(); + return [self startWithNext:^(id next) + { + [subscriber putNext:next]; + } error:^(id error) + { + [subscriber putError:error]; + } completed:^ + { + [subscriber putCompletion]; + }]; + }]; +} + - (SSignal *)onNext:(void (^)(id next))f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) diff --git a/SSignalKit/SSignal.m b/SSignalKit/SSignal.m index 00014b0861..6bf3ff4dde 100644 --- a/SSignalKit/SSignal.m +++ b/SSignalKit/SSignal.m @@ -86,6 +86,8 @@ #ifdef DEBUG return [[SSignal alloc] initWithGenerator:^id(SSubscriber *subscriber) { + NSString *traceName = [[NSString alloc] initWithFormat:@"%@#0x%x", name, (int)random()]; + NSLog(@"trace(%@ start)", traceName); return [self startWithNext:^(id next) { [subscriber putNext:next]; @@ -95,7 +97,7 @@ } completed:^ { [subscriber putCompletion]; - } traceName:name]; + } traceName:traceName]; }]; #else return self; diff --git a/SSignalKit/SSubscriber.m b/SSignalKit/SSubscriber.m index 988c83cb7d..2f75ea1cc0 100644 --- a/SSignalKit/SSubscriber.m +++ b/SSignalKit/SSubscriber.m @@ -150,6 +150,11 @@ OSSpinLockLock(&_lock); if (!_terminated) { + NSLog(@"trace(%@ terminated)", _name); + if ([_name hasPrefix:@"bestTcp4Signals"]) + { + int bp = 1; + } _terminated = true; _next = nil; _error = nil; @@ -169,9 +174,11 @@ if (fnext) { - NSLog(@"(%@ next: %@)", _name, next); + NSLog(@"trace(%@ next: %@)", _name, next); fnext(next); } + else + NSLog(@"trace(%@ next: %@, not accepted)", _name, next); } - (void)putError:(id)error @@ -193,9 +200,11 @@ if (ferror) { - NSLog(@"(%@ error: %@)", _name, error); + NSLog(@"trace(%@ error: %@)", _name, error); ferror(error); } + else + NSLog(@"trace(%@ error: %@, not accepted)", _name, error); if (shouldDispose) [self->_disposable dispose]; @@ -220,9 +229,11 @@ if (completed) { - NSLog(@"(%@ completed)", _name); + NSLog(@"trace(%@ completed)", _name); completed(); } + else + NSLog(@"trace(%@ completed, not accepted)", _name); if (shouldDispose) [self->_disposable dispose]; @@ -230,7 +241,7 @@ - (void)dispose { - NSLog(@"(%@ dispose)", _name); + NSLog(@"trace(%@ dispose)", _name); [self->_disposable dispose]; }