Skip to content

Commit d22a285

Browse files
committed
perf(all): 优化性能,生成启动图的逻辑由原来的"viewDidLoad"改为"viewDidAppear:"后执行
1 parent c54c961 commit d22a285

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

LLDynamicLaunchScreen/LLDynamicLaunchScreen.m

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ + (void)load {
4343
}
4444

4545

46-
void llDynamicIMP(id vc,SEL _cmd) {
46+
void llDynamicIMP(id vc, SEL _cmd, BOOL newValue) {
4747
struct objc_super superClazz = {
4848
.receiver = vc,
4949
.super_class = class_getSuperclass(object_getClass(vc))
5050
};
51-
((void (*)(void *, SEL))objc_msgSendSuper)(&superClazz, _cmd);
51+
((void (*)(void *, SEL, BOOL))objc_msgSendSuper)(&superClazz, _cmd, newValue);
5252
[LLDynamicLaunchScreen backupSystemLaunchImage];
5353

5454
// 还原isa对象(Restore isa object)
@@ -68,41 +68,44 @@ void llDynamicIMP(id vc,SEL _cmd) {
6868
static NSString *_oldClassName = nil;
6969
/// 通过KVO在第一个VIewController执行viewDidLoad后执行自定义方法(Use KVO to execute a custom method before the first VIewController executes viewDidLoad)
7070
+ (void)didBecomeKey:(NSNotification *)noti {
71+
7172
UIWindow *window = noti.object;
7273

7374
if (CGRectEqualToRect(window.frame, UIScreen.mainScreen.bounds) == NO ||
7475
window.hidden == YES) {
7576
return;
7677
}
7778

78-
UIViewController *currentVC = window.rootViewController;
79-
if ([currentVC isKindOfClass:UITabBarController.class]) {
80-
UITabBarController *t_tabBarController = (UITabBarController *)currentVC;
81-
currentVC = t_tabBarController.selectedViewController;
82-
if ([currentVC isKindOfClass:UINavigationController.class]) {
79+
[self launchImageIsNewVersion:^{
80+
UIViewController *currentVC = window.rootViewController;
81+
if ([currentVC isKindOfClass:UITabBarController.class]) {
82+
UITabBarController *t_tabBarController = (UITabBarController *)currentVC;
83+
currentVC = t_tabBarController.selectedViewController;
84+
if ([currentVC isKindOfClass:UINavigationController.class]) {
85+
UINavigationController *t_nav = (UINavigationController *)currentVC;
86+
currentVC = t_nav.topViewController;
87+
}
88+
} else if ([currentVC isKindOfClass:UINavigationController.class]) {
8389
UINavigationController *t_nav = (UINavigationController *)currentVC;
8490
currentVC = t_nav.topViewController;
8591
}
86-
} else if ([currentVC isKindOfClass:UINavigationController.class]) {
87-
UINavigationController *t_nav = (UINavigationController *)currentVC;
88-
currentVC = t_nav.topViewController;
89-
}
90-
91-
Method method = class_getInstanceMethod(currentVC.class, NSSelectorFromString(@"viewDidLoad"));
92-
NSString *oldClassName = NSStringFromClass(currentVC.class);
93-
_oldClassName = oldClassName;
94-
NSString *kvoClassName = [@"LLDynamicKVO_" stringByAppendingString:oldClassName];
95-
Class kvoClass;
96-
kvoClass = objc_lookUpClass(kvoClassName.UTF8String);
97-
if (!kvoClass) {
98-
kvoClass = objc_allocateClassPair(currentVC.class, kvoClassName.UTF8String, 0);
99-
objc_registerClassPair(kvoClass);
100-
}
92+
93+
Method method = class_getInstanceMethod(currentVC.class, NSSelectorFromString(@"viewDidAppear:"));
94+
NSString *oldClassName = NSStringFromClass(currentVC.class);
95+
_oldClassName = oldClassName;
96+
NSString *kvoClassName = [@"LLDynamicKVO_" stringByAppendingString:oldClassName];
97+
Class kvoClass;
98+
kvoClass = objc_lookUpClass(kvoClassName.UTF8String);
99+
if (!kvoClass) {
100+
kvoClass = objc_allocateClassPair(currentVC.class, kvoClassName.UTF8String, 0);
101+
objc_registerClassPair(kvoClass);
102+
}
101103

102-
if (method) {
103-
class_addMethod(kvoClass,NSSelectorFromString(@"viewDidLoad"), (IMP)llDynamicIMP, "v@");
104-
}
105-
object_setClass(currentVC, kvoClass);
104+
if (method) {
105+
class_addMethod(kvoClass,NSSelectorFromString(@"viewDidAppear:"), (IMP)llDynamicIMP, "v@:B");
106+
}
107+
object_setClass(currentVC, kvoClass);
108+
} identifier:NSStringFromSelector(@selector(didBecomeKey:))];
106109

107110
[NSNotificationCenter.defaultCenter removeObserver:self name:UIWindowDidBecomeKeyNotification object:nil];
108111
}
@@ -151,6 +154,7 @@ + (void)initialization {
151154
[versionDictionary setObject:@"YES" forKey:NSStringFromSelector(@selector(initialization))];
152155
[versionDictionary setObject:@"YES" forKey:NSStringFromSelector(@selector(backupSystemLaunchImage))];
153156
[versionDictionary setObject:@"YES" forKey:NSStringFromSelector(@selector(repairException))];
157+
[versionDictionary setObject:@"YES" forKey:NSStringFromSelector(@selector(didBecomeKey:))];
154158

155159
[NSUserDefaults.standardUserDefaults setObject:versionDictionary.copy forKey:launchImageVersionIdentifier];
156160

0 commit comments

Comments
 (0)