mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
30790be1b5
Summary: In working to remove dead code from the code base, we identified that a number of classes that subclassed `RCTEventEmitter` were being reported as unused when they are in active use. That was due to a lack of a `[super initialize]`. This diff adds the call to super. Changelog: [General] [Added] - Call to `super` in `+initialize` of `RCTEventEmitter` Reviewed By: javache Differential Revision: D19727783 fbshipit-source-id: 19c6c7f08e7a8b2f764988fdfcd70f92dbf1b74b
104 lines
2.7 KiB
Objective-C
104 lines
2.7 KiB
Objective-C
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RCTEventEmitter.h"
|
|
#import "RCTAssert.h"
|
|
#import "RCTUtils.h"
|
|
#import "RCTLog.h"
|
|
|
|
@implementation RCTEventEmitter
|
|
{
|
|
NSInteger _listenerCount;
|
|
}
|
|
|
|
@synthesize invokeJS = _invokeJS;
|
|
|
|
+ (NSString *)moduleName
|
|
{
|
|
return @"";
|
|
}
|
|
|
|
+ (void)initialize
|
|
{
|
|
[super initialize];
|
|
if (self != [RCTEventEmitter class]) {
|
|
RCTAssert(RCTClassOverridesInstanceMethod(self, @selector(supportedEvents)),
|
|
@"You must override the `supportedEvents` method of %@", self);
|
|
}
|
|
}
|
|
|
|
- (NSArray<NSString *> *)supportedEvents
|
|
{
|
|
return nil;
|
|
}
|
|
|
|
- (void)sendEventWithName:(NSString *)eventName body:(id)body
|
|
{
|
|
RCTAssert(_bridge != nil || _invokeJS != nil, @"Error when sending event: %@ with body: %@. "
|
|
"Bridge is not set. This is probably because you've "
|
|
"explicitly synthesized the bridge in %@, even though it's inherited "
|
|
"from RCTEventEmitter.", eventName, body, [self class]);
|
|
|
|
if (RCT_DEBUG && ![[self supportedEvents] containsObject:eventName]) {
|
|
RCTLogError(@"`%@` is not a supported event type for %@. Supported events are: `%@`",
|
|
eventName, [self class], [[self supportedEvents] componentsJoinedByString:@"`, `"]);
|
|
}
|
|
if (_listenerCount > 0 && _bridge) {
|
|
[_bridge enqueueJSCall:@"RCTDeviceEventEmitter"
|
|
method:@"emit"
|
|
args:body ? @[eventName, body] : @[eventName]
|
|
completion:NULL];
|
|
} else if (_listenerCount > 0 && _invokeJS) {
|
|
_invokeJS(@"RCTDeviceEventEmitter", @"emit", body ? @[eventName, body] : @[eventName]);
|
|
} else {
|
|
RCTLogWarn(@"Sending `%@` with no listeners registered.", eventName);
|
|
}
|
|
}
|
|
|
|
- (void)startObserving
|
|
{
|
|
// Does nothing
|
|
}
|
|
|
|
- (void)stopObserving
|
|
{
|
|
// Does nothing
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
if (_listenerCount > 0) {
|
|
[self stopObserving];
|
|
}
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(addListener:(NSString *)eventName)
|
|
{
|
|
if (RCT_DEBUG && ![[self supportedEvents] containsObject:eventName]) {
|
|
RCTLogError(@"`%@` is not a supported event type for %@. Supported events are: `%@`",
|
|
eventName, [self class], [[self supportedEvents] componentsJoinedByString:@"`, `"]);
|
|
}
|
|
_listenerCount++;
|
|
if (_listenerCount == 1) {
|
|
[self startObserving];
|
|
}
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(removeListeners:(double)count)
|
|
{
|
|
int currentCount = (int)count;
|
|
if (RCT_DEBUG && currentCount > _listenerCount) {
|
|
RCTLogError(@"Attempted to remove more %@ listeners than added", [self class]);
|
|
}
|
|
_listenerCount = MAX(_listenerCount - currentCount, 0);
|
|
if (_listenerCount == 0) {
|
|
[self stopObserving];
|
|
}
|
|
}
|
|
|
|
@end
|