feat:use global anchor hook to print log

This commit is contained in:
pengfei.zhou
2021-07-20 11:29:53 +08:00
committed by osborn
parent 17e14e7119
commit a021aae3de
9 changed files with 71 additions and 43 deletions

View File

@@ -27,7 +27,7 @@
#import "DoricDebugDriver.h"
#import "DoricDevViewController.h"
#import "DoricDevMonitor.h"
#import "DoricUtil.h"
#import "DoricDevPerformanceAnchorHook.h"
@interface DoricContextDebuggable : NSObject
@property(nonatomic, weak) DoricContext *doricContext;
@@ -79,6 +79,7 @@ - (instancetype)init {
_callbacks = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory];
_reloadingContexts = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory];
[DoricNativeDriver.instance.registry registerMonitor:[DoricDevMonitor new]];
DoricNativeDriver.instance.registry.globalPerformanceAnchorHook = [DoricDevPerformanceAnchorHook new];
}
return self;
}
@@ -199,7 +200,7 @@ - (void)reload:(NSString *)source script:(NSString *)script {
DoricLog(@"Context source %@ in debugging,skip reload", source);
} else {
DoricLog(@"Context reload :id %@,source %@", context.contextId, source);
dispatch_async(dispatch_get_main_queue(), ^{
[context reload:script];
[self.reloadingContexts addObject:context];
@@ -274,32 +275,32 @@ - (NSString *)ip {
withString:@""];
}
UIViewController* _Nonnull findBestViewController(UIViewController* _Nonnull vc) {
UIViewController *_Nonnull findBestViewController(UIViewController *_Nonnull vc) {
if (vc.presentedViewController && ![vc.presentedViewController isKindOfClass:[UIAlertController class]]) {
// Return presented view controller
return findBestViewController(vc.presentedViewController);
} else if ([vc isKindOfClass:[UISplitViewController class]]) {
// Return right hand side
UISplitViewController* svc = (UISplitViewController*) vc;
UISplitViewController *svc = (UISplitViewController *) vc;
if (svc.viewControllers.count > 0)
return findBestViewController(svc.viewControllers.lastObject);
else
return vc;
} else if ([vc isKindOfClass:[UINavigationController class]]) {
// Return top view
UINavigationController* svc = (UINavigationController*) vc;
UINavigationController *svc = (UINavigationController *) vc;
if (svc.viewControllers.count > 0)
return findBestViewController(svc.topViewController);
else
return vc;
} else if ([vc isKindOfClass:[UITabBarController class]]) {
// Return visible view
UITabBarController* svc = (UITabBarController*) vc;
UITabBarController *svc = (UITabBarController *) vc;
if (svc.viewControllers.count > 0)
return findBestViewController(svc.selectedViewController);
else
return vc;
} else {
} else {
// Unknown view controller type, return last child view controller
return vc;
}

View File

@@ -0,0 +1,9 @@
//
// Created by pengfei.zhou on 2021/7/20.
//
#import <Foundation/Foundation.h>
#import <DoricCore/Doric.h>
@interface DoricDevPerformanceAnchorHook : NSObject<DoricPerformanceGlobalAnchorHookProtocol>
@end

View File

@@ -0,0 +1,17 @@
//
// Created by pengfei.zhou on 2021/7/20.
//
#import "DoricDevPerformanceAnchorHook.h"
@implementation DoricDevPerformanceAnchorHook
- (void)onAnchorName:(NSString *)name prepare:(NSNumber *)prepare start:(NSNumber *)start end:(NSNumber *)end in:(DoricPerformanceProfile *)profile {
NSLog(@"[DoricPerformance] %@: %@ prepared %@ms, cost %@ms",
profile.name,
name,
@(start.integerValue - prepare.integerValue),
@(end.integerValue - start.integerValue)
);
}
@end

View File

@@ -42,6 +42,7 @@ NS_ASSUME_NONNULL_BEGIN
@end
@interface DoricPerformanceProfile : NSObject
@property(nonatomic, copy) NSString *name;
- (instancetype)initWithName:(NSString *)name;

View File

@@ -24,7 +24,6 @@
#import "DoricRegistry.h"
@interface DoricPerformanceProfile ()
@property(nonatomic, copy) NSString *name;
@property(nonatomic, strong) dispatch_queue_t anchorQueue;
@property(nonatomic, assign) BOOL enable;
@property(nonatomic, strong) NSHashTable<id <DoricPerformanceAnchorHookProtocol>> *hooks;
@@ -108,15 +107,9 @@ - (void)print:(NSString *)anchorName {
if (!prepare) {
prepare = start;
}
NSLog(@"[DoricPerformanceProfile] %@: %@ prepared %@ms, cost %@ms",
self.name,
anchorName,
@(start.integerValue - prepare.integerValue),
@(end.integerValue - start.integerValue)
);
for (id <DoricPerformanceAnchorHookProtocol> hook in self.hooks) {
if ([hook conformsToProtocol:@protocol(DoricPerformanceGlobalAnchorHookProtocol)]) {
[hook onAnchorName:anchorName prepare:end start:end end:end in:self];
[(id <DoricPerformanceGlobalAnchorHookProtocol>) hook onAnchorName:anchorName prepare:end start:end end:end in:self];
} else {
[hook onAnchorName:anchorName prepare:prepare start:start end:end];
}