diff --git a/Libraries/Network/RCTNetworking.mm b/Libraries/Network/RCTNetworking.mm index c6fbe7092a7..edbbe814e6e 100644 --- a/Libraries/Network/RCTNetworking.mm +++ b/Libraries/Network/RCTNetworking.mm @@ -159,7 +159,7 @@ RCT_EXPORT_MODULE() - (instancetype)initWithHandlersProvider:(NSArray> * (^)(void))getHandlers { - if (self = [super init]) { + if (self = [super initWithDisabledObservation]) { _handlersProvider = getHandlers; } return self; diff --git a/React/Modules/RCTEventEmitter.h b/React/Modules/RCTEventEmitter.h index f04d50f0241..f72f53909f4 100644 --- a/React/Modules/RCTEventEmitter.h +++ b/React/Modules/RCTEventEmitter.h @@ -16,6 +16,8 @@ @property (nonatomic, weak) RCTBridge *bridge; +- (instancetype)initWithDisabledObservation; + /** * Override this method to return an array of supported event names. Attempting * to observe or send an event that isn't included in this list will result in diff --git a/React/Modules/RCTEventEmitter.m b/React/Modules/RCTEventEmitter.m index 6e5a6ff37e7..c3cc596e13c 100644 --- a/React/Modules/RCTEventEmitter.m +++ b/React/Modules/RCTEventEmitter.m @@ -12,6 +12,7 @@ @implementation RCTEventEmitter { NSInteger _listenerCount; + BOOL _observationDisabled; } @synthesize invokeJS = _invokeJS; @@ -32,6 +33,13 @@ } } +- (instancetype)initWithDisabledObservation +{ + self = [super init]; + _observationDisabled = YES; + return self; +} + - (NSArray *)supportedEvents { return nil; @@ -56,12 +64,15 @@ [self class], [[self supportedEvents] componentsJoinedByString:@"`, `"]); } - if (_listenerCount > 0 && _bridge) { + + BOOL shouldEmitEvent = (_observationDisabled || _listenerCount > 0); + + if (shouldEmitEvent && _bridge) { [_bridge enqueueJSCall:@"RCTDeviceEventEmitter" method:@"emit" args:body ? @[ eventName, body ] : @[ eventName ] completion:NULL]; - } else if (_listenerCount > 0 && _invokeJS) { + } else if (shouldEmitEvent && _invokeJS) { _invokeJS(@"RCTDeviceEventEmitter", @"emit", body ? @[ eventName, body ] : @[ eventName ]); } else { RCTLogWarn(@"Sending `%@` with no listeners registered.", eventName); @@ -80,6 +91,10 @@ - (void)invalidate { + if (_observationDisabled) { + return; + } + if (_listenerCount > 0) { [self stopObserving]; } @@ -87,6 +102,10 @@ RCT_EXPORT_METHOD(addListener : (NSString *)eventName) { + if (_observationDisabled) { + return; + } + if (RCT_DEBUG && ![[self supportedEvents] containsObject:eventName]) { RCTLogError( @"`%@` is not a supported event type for %@. Supported events are: `%@`", @@ -102,6 +121,10 @@ RCT_EXPORT_METHOD(addListener : (NSString *)eventName) RCT_EXPORT_METHOD(removeListeners : (double)count) { + if (_observationDisabled) { + return; + } + int currentCount = (int)count; if (RCT_DEBUG && currentCount > _listenerCount) { RCTLogError(@"Attempted to remove more %@ listeners than added", [self class]);