Repository: incubator-weex Updated Branches: refs/heads/0.16-dev 88ae8eb96 -> 9684dcd75
+ [ios] distinguish the global pretender and user pretender Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/e939607a Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/e939607a Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/e939607a Branch: refs/heads/0.16-dev Commit: e939607a98d8ffcdc7af7e747a753350003aa8d1 Parents: 364a40c Author: é½å±± <sunjjb...@163.com> Authored: Tue Aug 29 13:09:43 2017 +0800 Committer: é½å±± <sunjjb...@163.com> Committed: Tue Aug 29 13:09:43 2017 +0800 ---------------------------------------------------------------------- .../Sources/Controller/WXBaseViewController.m | 4 +- ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 4 +- .../WeexSDK/Sources/Module/WXPrerenderManager.h | 15 +++++ .../WeexSDK/Sources/Module/WXPrerenderManager.m | 62 ++++++++++++++++---- 4 files changed, 71 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e939607a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m b/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m index 1c90b1e..c49d4a8 100644 --- a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m +++ b/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.m @@ -120,7 +120,7 @@ } [_instance destroyInstance]; - if([WXPrerenderManager isTaskExist:[self.sourceURL absoluteString]]){ + if([WXPrerenderManager isTaskReady:[self.sourceURL absoluteString]]){ _instance = [WXPrerenderManager instanceFromUrl:self.sourceURL.absoluteString]; } @@ -154,7 +154,7 @@ [weakSelf _updateInstanceState:WeexInstanceAppear]; }; - if([WXPrerenderManager isTaskExist:[self.sourceURL absoluteString]]){ + if([WXPrerenderManager isTaskReady:[self.sourceURL absoluteString]]){ WX_MONITOR_INSTANCE_PERF_START(WXPTJSDownload, _instance); WX_MONITOR_INSTANCE_PERF_END(WXPTJSDownload, _instance); WX_MONITOR_INSTANCE_PERF_START(WXPTFirstScreenRender, _instance); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e939607a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m index 0a6fe11..2e13dbb 100644 --- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m +++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m @@ -349,7 +349,6 @@ typedef enum : NSUInteger { { NSString *url = @""; if([WXPrerenderManager isTaskExist:[self.scriptURL absoluteString]]) { - [WXPrerenderManager removePrerenderTaskforUrl:[self.scriptURL absoluteString]]; url = [self.scriptURL absoluteString]; } if (!self.instanceId) { @@ -357,6 +356,7 @@ typedef enum : NSUInteger { return; } + [WXPrerenderManager removePrerenderTaskforUrl:[self.scriptURL absoluteString]]; [WXPrerenderManager destroyTask:self.instanceId]; [[WXSDKManager bridgeMgr] destroyInstance:self.instanceId]; @@ -373,7 +373,7 @@ typedef enum : NSUInteger { }); }); if(url.length > 0){ - [WXPrerenderManager addTask:url instanceId:@"" callback:nil]; + [WXPrerenderManager addGlobalTask:url callback:nil]; } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e939607a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h index c763b57..62e83e9 100644 --- a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h +++ b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h @@ -39,12 +39,27 @@ + (void) addTask:(NSString *) url instanceId:(NSString *)instanceId callback:(WXModuleCallback)callback; /** + * @abstract add prerender task + * + * @param url The prerender url string + * + * @param callback the module method callback + * + **/ ++ (void) addGlobalTask:(NSString *) url callback:(WXModuleCallback)callback; + +/** * @abstract Returns true if url is exist in task . * **/ + (BOOL) isTaskExist:(NSString *)url; /** + * @abstract Returns true if task ready. + * + **/ ++ (BOOL)isTaskReady:(NSString *)url; +/** * @abstract Returns key from url . * **/ http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e939607a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m index dbbf71a..07f26a6 100644 --- a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m +++ b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m @@ -41,6 +41,7 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; @property (nonatomic, assign) WXState state; @property (nonatomic, strong) NSDate *beginDate; @property (nonatomic) long long cacheTime; +@property (nonatomic) BOOL isCache; // if set cache , cachetime is no use @end @implementation WXPrerenderTask @@ -54,7 +55,6 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; @property (nonatomic, strong) NSMutableDictionary<NSString *, WXPrerenderTask*> *prerenderTasks; @property (nonatomic) NSInteger maxCacheNumber; - @end @implementation WXPrerenderManager @@ -99,7 +99,24 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; WXPrerenderManager *manager = [WXPrerenderManager sharedInstance]; __weak WXPrerenderManager *weakSelf = manager; dispatch_async(manager.queue, ^{ - [weakSelf prerender:newUrl instanceId:instanceId callback:callback]; + [weakSelf prerender:newUrl instanceId:instanceId isCache:NO callback:callback]; + }); +} + ++ (void) addGlobalTask:(NSString *) url callback:(WXModuleCallback)callback +{ + NSURL *newUrl = [NSURL URLWithString:url]; + if(!newUrl){ + if(callback){ + callback(@{@"url":url,@"message":MSG_PRERENDER_INTERNAL_ERROR,@"result":@"error"}); + } + return; + } + + WXPrerenderManager *manager = [WXPrerenderManager sharedInstance]; + __weak WXPrerenderManager *weakSelf = manager; + dispatch_async(manager.queue, ^{ + [weakSelf prerender:newUrl instanceId:@"" isCache:YES callback:callback]; }); } @@ -119,7 +136,7 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; return YES; } -- (void) prerender:(NSURL *)url instanceId:(NSString *)instanceId callback:(WXModuleCallback) callback{ +- (void) prerender:(NSURL *)url instanceId:(NSString *)instanceId isCache:(BOOL)isCache callback:(WXModuleCallback) callback{ NSString *str = url.absoluteString; if(str.length==0){ @@ -151,11 +168,14 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; self.maxCacheNumber = max; } } + + WXSDKInstance *instance = [[WXSDKInstance alloc] init]; instance.needPrerender = YES; task.instance = instance; task.parentInstanceId = instanceId; task.url = url.absoluteString; + task.isCache = isCache; if(self.prerenderTasks && self.prerenderTasks.count<self.maxCacheNumber){ [self.prerenderTasks setObject:task forKey:[WXPrerenderManager getTaskKeyFromUrl:url.absoluteString]]; @@ -185,11 +205,10 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; } } -+ (BOOL)isTaskExist:(NSString *)url{ - return [[WXPrerenderManager sharedInstance]isTaskExist:url]; ++ (BOOL)isTaskReady:(NSString *)url{ + return [[WXPrerenderManager sharedInstance]isTaskReady:url]; } - -- (BOOL)isTaskExist:(NSString *)url +- (BOOL)isTaskReady:(NSString *)url { if( !url ||url.length == 0){ return NO; @@ -203,10 +222,30 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; } // compare cache time with begin time NSTimeInterval time = [[NSDate date] timeIntervalSinceDate:task.beginDate]; - if(time > task.cacheTime){ + if(time > task.cacheTime && !task.isCache){ return NO; } + if(!task.view) // view not exist ï¼not prerender + { + return NO; + } + if(task ){ + return YES; + } + return NO; +} + ++ (BOOL)isTaskExist:(NSString *)url{ + return [[WXPrerenderManager sharedInstance]isTaskExist:url]; +} + +- (BOOL)isTaskExist:(NSString *)url +{ + if( !url ||url.length == 0){ + return NO; + } + WXPrerenderTask *task = [self.prerenderTasks objectForKey:[WXPrerenderManager getTaskKeyFromUrl:url]]; if(task ){ return YES; } @@ -216,7 +255,7 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; + (void)renderFromCache:(NSString *)url { WXPrerenderManager *manager = [WXPrerenderManager sharedInstance]; - if([manager isTaskExist:url]) + if([manager isTaskReady:url]) { WXPrerenderTask *task = [manager.prerenderTasks objectForKey:[WXPrerenderManager getTaskKeyFromUrl:url]]; @@ -265,7 +304,10 @@ static NSString *const MSG_PRERENDER_SUCCESS = @"success"; if (url.length > 0) { WXPrerenderManager *manager = [WXPrerenderManager sharedInstance]; if(manager.prerenderTasks && [manager.prerenderTasks count]>0){ - [manager.prerenderTasks removeObjectForKey:[WXPrerenderManager getTaskKeyFromUrl:url]]; + WXPrerenderTask *task = [manager.prerenderTasks objectForKey:[WXPrerenderManager getTaskKeyFromUrl:url]]; + if(task){ + [manager.prerenderTasks removeObjectForKey:[WXPrerenderManager getTaskKeyFromUrl:url]]; + } } } }