feat: cache resource move from global to each context
This commit is contained in:
@@ -48,6 +48,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
@property(nonatomic, copy) NSString *extra;
|
||||
@property(nonatomic, assign) BOOL destroyed;
|
||||
@property(nonatomic, strong) DoricPerformanceProfile *performanceProfile;
|
||||
@property(nonatomic, strong) NSMapTable <NSString *, __kindof DoricResource *> *cachedResources;
|
||||
|
||||
- (instancetype)initWithScript:(NSString *)script source:(NSString *)source extra:(NSString *)extra;
|
||||
|
||||
|
@@ -42,6 +42,9 @@ - (instancetype)initWithScript:(NSString *)script source:(NSString *)source extr
|
||||
_headNodes = [NSMutableDictionary new];
|
||||
DoricRootNode *rootNode = [[DoricRootNode alloc] initWithContext:self];
|
||||
_rootNode = rootNode;
|
||||
_cachedResources = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsCopyIn
|
||||
valueOptions:NSPointerFunctionsWeakMemory
|
||||
capacity:0];
|
||||
[self init:extra];
|
||||
[self callEntity:DORIC_ENTITY_CREATE withArgumentsArray:@[]];
|
||||
}
|
||||
@@ -66,6 +69,7 @@ - (void)dealloc {
|
||||
[[DoricContextManager instance] destroyContext:self];
|
||||
[self callEntity:DORIC_ENTITY_DESTROY withArgumentsArray:@[]];
|
||||
[self.driver destroyContext:self.contextId];
|
||||
[self.cachedResources removeAllObjects];
|
||||
}
|
||||
|
||||
- (DoricAsyncResult *)callEntity:(NSString *)method, ... {
|
||||
|
@@ -18,10 +18,10 @@
|
||||
//
|
||||
|
||||
#import "DoricResourceManager.h"
|
||||
#import "DoricContext.h"
|
||||
|
||||
@interface DoricResourceManager ()
|
||||
@property(nonatomic, strong) NSMutableDictionary <NSString *, id <DoricResourceLoader>> *loaders;
|
||||
@property(nonatomic, strong) NSMapTable <NSString *, __kindof DoricResource *> *cachedResources;
|
||||
@property(nonatomic, strong) dispatch_queue_t mapQueue;
|
||||
@end
|
||||
|
||||
@@ -30,9 +30,6 @@ - (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
_loaders = [NSMutableDictionary new];
|
||||
_mapQueue = dispatch_queue_create("doric.resource", DISPATCH_QUEUE_SERIAL);
|
||||
_cachedResources = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsCopyIn
|
||||
valueOptions:NSPointerFunctionsWeakMemory
|
||||
capacity:0];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -56,11 +53,11 @@ - (__kindof DoricResource *)load:(NSDictionary *)resource
|
||||
NSString *resId = resource[@"resId"];
|
||||
__block __kindof DoricResource *doricResource;
|
||||
dispatch_sync(self.mapQueue, ^() {
|
||||
doricResource = [self.cachedResources objectForKey:resId];
|
||||
doricResource = [context.cachedResources objectForKey:resId];
|
||||
if (!doricResource) {
|
||||
id <DoricResourceLoader> loader = self.loaders[type];
|
||||
doricResource = [loader load:identifier withContext:context];
|
||||
[self.cachedResources setObject:doricResource forKey:resId];
|
||||
[context.cachedResources setObject:doricResource forKey:resId];
|
||||
}
|
||||
});
|
||||
return doricResource;
|
||||
|
Reference in New Issue
Block a user