iOS 는 react-native 프 리 로드 를 실현 하고 첫 번 째 화이트 스크린 문 제 를 최적화 합 니 다.

프로젝트 에 여러 개의 react-native 페이지 입구 가 존재 합 니 다.입구 마다 다음 과 같은 방법 으로 초기 화 합 니 다.
- (instancetype)initWithBundleURL:(NSURL *)bundleURL
                       moduleName:(NSString *)moduleName
                initialProperties:(NSDictionary *)initialProperties
                    launchOptions:(NSDictionary *)launchOptions;

그러나 디 버 깅 에서 두 가지 현상 이 발견 되 었 습 니 다.1.react-native 페이지 에 반복 적 으로 들 어가 거나 react-native 페이지 를 종료 하 는 작업 은 RCTBridge 대상 이 반복 적 으로 생 성 되 고 소 거 됩 니 다.가끔 RCTBridge 대상 이 제때에 만 들 지 못 하면 crash 2.네 이 티 브 페이지 와 react-native 페이지 가 서로 이동 하 는 것 은 RCTBridge 도 중복 되 어 만들어 져 메모리 비용 이 많이 든다.
의문 을 가지 고 RCTROtView 를 읽 으 러 갑 니 다.h 세부 사항 발견:
/**
 * - Designated initializer -
 */
- (instancetype)initWithBridge:(RCTBridge *)bridge
                    moduleName:(NSString *)moduleName
             initialProperties:(NSDictionary *)initialProperties NS_DESIGNATED_INITIALIZER;

/**
 * - Convenience initializer -
 * A bridge will be created internally.
 * This initializer is intended to be used when the app has a single RCTRootView,
 * otherwise create an `RCTBridge` and pass it in via `initWithBridge:moduleName:`
 * to all the instances.
 */
- (instancetype)initWithBundleURL:(NSURL *)bundleURL
                       moduleName:(NSString *)moduleName
                initialProperties:(NSDictionary *)initialProperties
                    launchOptions:(NSDictionary *)launchOptions;

항목 에 여러 개의 RCTROtView 를 사용 하 는 것 을 볼 수 있 을 때 다음 과 같은 방법 으로 초기 화 하 는 것 을 추천 합 니 다.
- (instancetype)initWithBridge:(RCTBridge *)bridge
                    moduleName:(NSString *)moduleName
             initialProperties:(NSDictionary *)initialProperties NS_DESIGNATED_INITIALIZER;

상기 두 가지 현상 과 추천 하 는 API 초기 화 를 통 해 하나의 bridge 대상 을 초기 화하 여 상기 문 제 를 해결 할 수 있 습 니 다.
//.h
@interface BridgeManager: RCTBridge

+ (BridgeManager*)shareInstance;
@end

@interface BridgeHandle : NSObject<RCTBridgeDelegate>

@end

//.m
implementation MallBridgeHandle

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
    return [[NSBundle mainBundle] URLForResource:@"index.ios" withExtension:@"jsbundle"];  
}
@end

@implementation BridgeManager
static BridgeManager * manager = nil;
static dispatch_once_t onceToken;
+ (BridgeManager*)shareInstance
{
    dispatch_once(&onceToken,^{
        manager = [BridgeManager alloc] initWithDelegate:[[BridgeHandle alloc] init] launchOptions:nil]; 
    });
    return manager ;
}
@end

단일 예 는 프로그램 이 시 작 될 때 초기 화 됩 니 다.테스트 검증 을 통 해 알 수 있 듯 이 메모리 가 최적화 되 고 백 스크린 문제 가 해결 되 었 다.

좋은 웹페이지 즐겨찾기