RACDynamicSignal.m 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. //
  2. // RACDynamicSignal.m
  3. // ReactiveObjC
  4. //
  5. // Created by Justin Spahr-Summers on 2013-10-10.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "RACDynamicSignal.h"
  9. #import <ReactiveObjC/RACEXTScope.h>
  10. #import "RACCompoundDisposable.h"
  11. #import "RACPassthroughSubscriber.h"
  12. #import "RACScheduler+Private.h"
  13. #import "RACSubscriber.h"
  14. #import <libkern/OSAtomic.h>
  15. @interface RACDynamicSignal ()
  16. // The block to invoke for each subscriber.
  17. @property (nonatomic, copy, readonly) RACDisposable * (^didSubscribe)(id<RACSubscriber> subscriber);
  18. @end
  19. @implementation RACDynamicSignal
  20. #pragma mark Lifecycle
  21. + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
  22. RACDynamicSignal *signal = [[self alloc] init];
  23. signal->_didSubscribe = [didSubscribe copy];
  24. return [signal setNameWithFormat:@"+createSignal:"];
  25. }
  26. #pragma mark Managing Subscribers
  27. - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
  28. NSCParameterAssert(subscriber != nil);
  29. RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
  30. subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
  31. if (self.didSubscribe != NULL) {
  32. RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
  33. RACDisposable *innerDisposable = self.didSubscribe(subscriber);
  34. [disposable addDisposable:innerDisposable];
  35. }];
  36. [disposable addDisposable:schedulingDisposable];
  37. }
  38. return disposable;
  39. }
  40. @end