mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-05-15 17:28:33 +08:00
Move setBridge: off main thread
Summary: Previously, if a module implemented `setBridge:` we assumed that it needs to be initialised on the main thread. This assumption was not really warranted however, and it was a barrier to deferring module initialization. This diff tweaks the rules so that only modules that override `init` or `constantsToExport**` are assumed to require main thread initialization, and others can be created lazily when they are first used. WARNING: this will be a breaking change to any 3rd party modules that are assuming `setBridge:` is called on the main thread. Those modules should be rewritten to move any code that requires the main thread into `init` or `constantsToExport` instead. `**` We will also be examining whether `constantsToExport` can be done lazily, but for now any module that uses it will still be created eagerly when the bridge starts up. Reviewed By: javache Differential Revision: D3240682 fb-gh-sync-id: 48f309e3158bbccb52141032baf70def3e609371 fbshipit-source-id: 48f309e3158bbccb52141032baf70def3e609371
This commit is contained in:
committed by
Facebook Github Bot 4
parent
55c8158c44
commit
34ec6a91a9
@@ -37,19 +37,15 @@
|
||||
_instanceLock = [NSLock new];
|
||||
|
||||
static IMP objectInitMethod;
|
||||
static SEL setBridgeSelector;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
objectInitMethod = [NSObject instanceMethodForSelector:@selector(init)];
|
||||
setBridgeSelector = NSSelectorFromString(@"setBridge:");
|
||||
});
|
||||
|
||||
// If a module overrides `init`, `setBridge:` then we must assume that it
|
||||
// expects for both of those methods to be called on the main thread, because
|
||||
// they may need to access UIKit.
|
||||
_requiresMainThreadSetup =
|
||||
[_moduleClass instancesRespondToSelector:setBridgeSelector] ||
|
||||
(!_instance && [_moduleClass instanceMethodForSelector:@selector(init)] != objectInitMethod);
|
||||
// If a module overrides `init` then we must assume that it expects to be
|
||||
// initialized on the main thread, because it may need to access UIKit.
|
||||
_requiresMainThreadSetup = !_instance &&
|
||||
[_moduleClass instanceMethodForSelector:@selector(init)] != objectInitMethod;
|
||||
|
||||
// If a module overrides `constantsToExport` then we must assume that it
|
||||
// must be called on the main thread, because it may need to access UIKit.
|
||||
|
||||
Reference in New Issue
Block a user