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)];
+        }
     }
 }
 

Reply via email to