RACPassthroughSubscriber.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //
  2. // RACPassthroughSubscriber.m
  3. // ReactiveObjC
  4. //
  5. // Created by Justin Spahr-Summers on 2013-06-13.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "RACPassthroughSubscriber.h"
  9. #import "RACCompoundDisposable.h"
  10. #import "RACSignal.h"
  11. #import "RACSignalProvider.h"
  12. #if !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED
  13. static const char *cleanedDTraceString(NSString *original) {
  14. return [original stringByReplacingOccurrencesOfString:@"\\s+" withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, original.length)].UTF8String;
  15. }
  16. static const char *cleanedSignalDescription(RACSignal *signal) {
  17. NSString *desc = signal.description;
  18. NSRange range = [desc rangeOfString:@" name:"];
  19. if (range.location != NSNotFound) {
  20. desc = [desc stringByReplacingCharactersInRange:range withString:@""];
  21. }
  22. return cleanedDTraceString(desc);
  23. }
  24. #endif
  25. @interface RACPassthroughSubscriber ()
  26. // The subscriber to which events should be forwarded.
  27. @property (nonatomic, strong, readonly) id<RACSubscriber> innerSubscriber;
  28. // The signal sending events to this subscriber.
  29. //
  30. // This property isn't `weak` because it's only used for DTrace probes, so
  31. // a zeroing weak reference would incur an unnecessary performance penalty in
  32. // normal usage.
  33. @property (nonatomic, unsafe_unretained, readonly) RACSignal *signal;
  34. // A disposable representing the subscription. When disposed, no further events
  35. // should be sent to the `innerSubscriber`.
  36. @property (nonatomic, strong, readonly) RACCompoundDisposable *disposable;
  37. @end
  38. @implementation RACPassthroughSubscriber
  39. #pragma mark Lifecycle
  40. - (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable {
  41. NSCParameterAssert(subscriber != nil);
  42. self = [super init];
  43. _innerSubscriber = subscriber;
  44. _signal = signal;
  45. _disposable = disposable;
  46. [self.innerSubscriber didSubscribeWithDisposable:self.disposable];
  47. return self;
  48. }
  49. #pragma mark RACSubscriber
  50. - (void)sendNext:(id)value {
  51. if (self.disposable.disposed) return;
  52. if (RACSIGNAL_NEXT_ENABLED()) {
  53. RACSIGNAL_NEXT(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString([value description]));
  54. }
  55. [self.innerSubscriber sendNext:value];
  56. }
  57. - (void)sendError:(NSError *)error {
  58. if (self.disposable.disposed) return;
  59. if (RACSIGNAL_ERROR_ENABLED()) {
  60. RACSIGNAL_ERROR(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString(error.description));
  61. }
  62. [self.innerSubscriber sendError:error];
  63. }
  64. - (void)sendCompleted {
  65. if (self.disposable.disposed) return;
  66. if (RACSIGNAL_COMPLETED_ENABLED()) {
  67. RACSIGNAL_COMPLETED(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description));
  68. }
  69. [self.innerSubscriber sendCompleted];
  70. }
  71. - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable {
  72. if (disposable != self.disposable) {
  73. [self.disposable addDisposable:disposable];
  74. }
  75. }
  76. @end