Repository: incubator-weex Updated Branches: refs/heads/0.16-dev b7631a359 -> 83250773f
+ [ios] add timers Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/46e6f3d6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/46e6f3d6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/46e6f3d6 Branch: refs/heads/0.16-dev Commit: 46e6f3d6960ebf850200a8b7a3d707ad2851a773 Parents: e52d273 Author: é½å±± <[email protected]> Authored: Thu Sep 21 11:55:08 2017 +0800 Committer: é½å±± <[email protected]> Committed: Thu Sep 21 11:55:08 2017 +0800 ---------------------------------------------------------------------- ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m | 85 ++++++++++++++------ 1 file changed, 59 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/46e6f3d6/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m index dd776a9..f974a0e 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m @@ -46,6 +46,8 @@ @property (nonatomic, strong) JSContext *jsContext; @property (nonatomic, strong) NSMutableArray *timers; +@property (nonatomic, strong) NSMutableDictionary *intervaltimers; +@property (nonatomic) long long intervalTimerId; @property (nonatomic, strong) NSMutableDictionary *callbacks; @end @@ -63,7 +65,9 @@ } _timers = [NSMutableArray new]; _callbacks = [NSMutableDictionary new]; - + _intervalTimerId = 0; + _intervaltimers = [NSMutableDictionary new]; + __weak typeof(self) weakSelf = self; NSDictionary *data = [WXUtility getEnvironment]; @@ -76,16 +80,19 @@ } afterDelay:[timeout toDouble] / 1000]; }; - _jsContext[@"setTimeoutWeex"] = ^(JSValue *appid, JSValue *ret,JSValue *arg ) { - [weakSelf triggerTimeout:[appid toString] ret:[ret toString] arg:[arg toString]]; + _jsContext[@"setTimeoutWeex"] = ^(JSValue *appId, JSValue *ret,JSValue *arg ) { + [weakSelf triggerTimeout:[appId toString] ret:[ret toString] arg:[arg toString]]; }; - _jsContext[@"setIntervalWeex"] = ^(JSValue *appid, JSValue *ret,JSValue *arg) { - [weakSelf triggerInterval:[appid toString] ret:[ret toString] arg:[arg toString]]; + _jsContext[@"setIntervalWeex"] = ^(JSValue *appId, JSValue *function,JSValue *arg) { + return [weakSelf triggerInterval:[appId toString] function:^() { + [function callWithArguments:@[]]; + } arg:[arg toString]]; }; - _jsContext[@"clearIntervalWeex"] = ^(JSValue *appid, JSValue *ret,JSValue *arg) { - [weakSelf triggerClearInterval:[appid toString] ret:[ret toString] arg:[arg toString]]; + _jsContext[@"clearIntervalWeex"] = ^(JSValue *appId, JSValue *ret,JSValue *arg) { + + [weakSelf triggerClearInterval:[appId toString] ret:[[ret toNumber] longLongValue]]; }; _jsContext[@"clearTimeoutWeex"] = ^(JSValue *ret) { @@ -411,6 +418,7 @@ #pragma mark - Public -(void)removeTimers:(NSString *)instance { + // remove timers if([_callbacks objectForKey:instance]){ NSMutableArray *arr = [_callbacks objectForKey:instance]; if(arr && [arr count]>0){ @@ -421,6 +429,10 @@ } } } + // remove intervaltimers + if(_intervaltimers && [_intervaltimers objectForKey:instance]){ + [_intervaltimers removeObjectForKey:instance]; + } } #pragma mark - Private @@ -451,20 +463,25 @@ - (void)callBack:(NSDictionary *)dic { if([dic objectForKey:@"ret"] && [_timers containsObject:[dic objectForKey:@"ret"]]) { - [[WXSDKManager bridgeMgr] callBack:[dic objectForKey:@"appid"] funcId:[dic objectForKey:@"ret"] params:[dic objectForKey:@"arg"] keepAlive:NO]; + [[WXSDKManager bridgeMgr] callBack:[dic objectForKey:@"appId"] funcId:[dic objectForKey:@"ret"] params:[dic objectForKey:@"arg"] keepAlive:NO]; } + } -- (void)callBackInterval:(NSDictionary *)dic +- (void)callBackInterval:(NSDictionary *)dic functon:(void(^)())block { - if([dic objectForKey:@"ret"] && [_timers containsObject:[dic objectForKey:@"ret"]]) { - [[WXSDKManager bridgeMgr] callBack:[dic objectForKey:@"appid"] funcId:[dic objectForKey:@"ret"] params:nil keepAlive:YES]; - [self triggerInterval:[dic objectForKey:@"appid"] ret:[dic objectForKey:@"ret"] arg:[dic objectForKey:@"arg"]]; + if([dic objectForKey:@"appId"] && [_intervaltimers objectForKey:[dic objectForKey:@"appId"]]){ + NSMutableArray *timers = [_intervaltimers objectForKey:[dic objectForKey:@"appId"]]; + if([timers containsObject:[dic objectForKey:@"timerId"]]){ + block(); + [self executeInterval:[dic objectForKey:@"appId"] function:block arg:[dic objectForKey:@"arg"] timerId:[[dic objectForKey:@"timerId"] longLongValue]]; + } } } -- (void)triggerTimeout:(NSString *)appid ret:(NSString *)ret arg:(NSString *)arg + +- (void)triggerTimeout:(NSString *)appId ret:(NSString *)ret arg:(NSString *)arg { double interval = [arg doubleValue]/1000.0f; @@ -473,42 +490,58 @@ } if(![_timers containsObject:ret]){ [_timers addObject:ret]; - [self addInstance:appid callback:ret]; + [self addInstance:appId callback:ret]; } dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, interval*NSEC_PER_SEC); dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSMutableDictionary *dic = [NSMutableDictionary new]; - [dic setObject:appid forKey:@"appid"]; + [dic setObject:appId forKey:@"appId"]; [dic setObject:ret forKey:@"ret"]; [dic setObject:arg forKey:@"arg"]; [self performSelector:@selector(callBack:) withObject:dic ]; }); } -- (void)triggerInterval:(NSString *)appid ret:(NSString *)ret arg:(NSString *)arg +- (long long)triggerInterval:(NSString *)appId function:(void(^)())block arg:(NSString *)arg { double interval = [arg doubleValue]/1000.0f; + long long timerId = _intervalTimerId + 1; if(WXFloatEqual(interval,0)) { - return; + return timerId; } - if(![_timers containsObject:ret]){ - [_timers addObject:ret]; - [self addInstance:appid callback:ret]; + if([_intervaltimers objectForKey:appId]){ + NSMutableArray *timers = [[_intervaltimers objectForKey:appId] mutableCopy]; + [timers addObject:@(timerId)]; + [_intervaltimers setObject:timers forKey:appId]; + }else { + NSMutableArray *timers = [NSMutableArray new]; + [timers addObject:@(timerId)]; + [_intervaltimers setObject:timers forKey:appId]; } + [self executeInterval:appId function:block arg:arg timerId:timerId]; + return timerId; +} + +-(void)executeInterval:(NSString *)appId function:(void(^)())block arg:(NSString *)arg timerId:(long long)timerId +{ + double interval = [arg doubleValue]/1000.0f; dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, interval*NSEC_PER_SEC); dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSMutableDictionary *dic = [NSMutableDictionary new]; - [dic setObject:appid forKey:@"appid"]; - [dic setObject:ret forKey:@"ret"]; + [dic setObject:appId forKey:@"appId"]; [dic setObject:arg forKey:@"arg"]; - [self performSelector:@selector(callBackInterval:) withObject:dic ]; + [dic setObject:@(timerId) forKey:@"timerId"]; + [self performSelector:@selector(callBackInterval:functon:) withObject:dic withObject:block]; }); } -- (void)triggerClearInterval:(NSString *)appid ret:(NSString *)ret arg:(NSString *)arg +- (void)triggerClearInterval:(NSString *)appId ret:(long long)ret { - if([_timers containsObject:ret]){ - [_timers removeObject:ret]; + if(_intervaltimers && [_intervaltimers objectForKey:@"appId"]){ + NSMutableArray *timers = [_intervaltimers objectForKey:@"appId"]; + if(timers && [timers containsObject:@(ret)]){ + [timers removeObject:@(ret)]; + } } }
