Skip to content

Commit fae7980

Browse files
committed
Registering native modules optimization
1 parent 93e0318 commit fae7980

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

Sources/ReactBridgeUtils/ReactBridgeUtils.m

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,37 @@
3535
BOOL isSync;
3636
} RCTMethodInfo;
3737

38-
@implementation ReactBridgeUtils
39-
40-
+ (void)load {
41-
SEL selector = @selector(_registerModule);
42-
43-
int numClasses = objc_getClassList(NULL, 0);
44-
Class* classes = (Class *)malloc(sizeof(Class) * numClasses);
45-
numClasses = objc_getClassList(classes, numClasses);
46-
47-
for (int i = 0; i < numClasses; i++) {
48-
Class class = classes[i];
49-
50-
unsigned int numMethods = 0;
51-
Method *methods = class_copyMethodList(object_getClass(class), &numMethods);
52-
for (int j = 0; j < numMethods; j++) {
53-
Method method = methods[j];
54-
if (sel_isEqual(method_getName(method), selector)) {
55-
IMP imp = method_getImplementation(method);
56-
((void (*)(Class, SEL))imp)(class, selector);
57-
continue;
58-
}
38+
static void class_performClassSelector(Class class, SEL selector) {
39+
unsigned int numMethods = 0;
40+
Method *methods = class_copyMethodList(object_getClass(class), &numMethods);
41+
for (int i = 0; i < numMethods; i++) {
42+
Method method = methods[i];
43+
if (sel_isEqual(method_getName(method), selector)) {
44+
IMP imp = method_getImplementation(method);
45+
((void (*)(Class, SEL))imp)(class, selector);
46+
break;
5947
}
60-
free(methods);
6148
}
62-
free(classes);
49+
free(methods);
6350
}
6451

52+
__attribute__((constructor))
53+
static void load() {
54+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
55+
SEL selector = @selector(_registerModule);
56+
int numClasses = objc_getClassList(NULL, 0);
57+
Class* classes = (Class *)malloc(sizeof(Class) * numClasses);
58+
numClasses = objc_getClassList(classes, numClasses);
59+
for (int i = 0; i < numClasses; i++) {
60+
Class class = classes[i];
61+
class_performClassSelector(class, selector);
62+
}
63+
free(classes);
64+
});
65+
}
66+
67+
@implementation ReactBridgeUtils
68+
6569
+ (const void *)methodInfo:(NSString *)jsName objcName:(NSString *)objcName isSync:(BOOL)isSync {
6670
RCTMethodInfo* methodInfo = malloc(sizeof(RCTMethodInfo));
6771
methodInfo->jsName = strdup([jsName cStringUsingEncoding: NSUTF8StringEncoding]);

0 commit comments

Comments
 (0)