Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

+ [ios] add feature timer #228

Merged
merged 1 commit into from
Apr 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,10 @@ - (void)destroyInstance:(NSString *)instance
if([self.insStack containsObject:instance]){
[self.insStack removeObject:instance];
}

if(_jsBridge){
[_jsBridge removeTimers:instance];
}

if(self.sendQueue[instance]){
[self.sendQueue removeObjectForKey:instance];
Expand Down
77 changes: 77 additions & 0 deletions ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#import "WXPolyfillSet.h"
#import "JSValue+Weex.h"
#import "WXJSExceptionProtocol.h"
#import "WXSDKManager.h"

#import <dlfcn.h>

Expand All @@ -31,6 +32,7 @@
@interface WXJSCoreBridge ()

@property (nonatomic, strong) JSContext *jsContext;
@property (nonatomic, strong) NSMutableArray *timers;

@end

Expand All @@ -45,6 +47,7 @@ - (instancetype)init
if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
_jsContext.name = @"Weex Context";
}
_timers = [NSMutableArray new];

__weak typeof(self) weakSelf = self;

Expand All @@ -58,6 +61,15 @@ - (instancetype)init
} afterDelay:[timeout toDouble] / 1000];
};

_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[@"nativeLog"] = ^() {
static NSDictionary *levelMap;
static dispatch_once_t onceToken;
Expand Down Expand Up @@ -229,11 +241,76 @@ - (void)garbageCollect
// }
}

#pragma mark - Public
-(void)removeTimers:(NSString *)instance
{
if(instance && [_timers containsObject:instance])
{
[_timers removeObject:instance];
}
}

#pragma mark - Private

- (void)triggerTimeout:(void(^)())block
{
block();
}

- (void)callBack:(NSDictionary *)dic
{
if([dic objectForKey:@"appid"] && [_timers containsObject:[dic objectForKey:@"appid"]]) {
[[WXSDKManager bridgeMgr] callBack:[dic objectForKey:@"appid"] funcId:[dic objectForKey:@"ret"] params:[dic objectForKey:@"arg"] keepAlive:NO];
}
}


- (void)callBackInterval:(NSDictionary *)dic
{
if([dic objectForKey:@"appid"] && [_timers containsObject:[dic objectForKey:@"appid"]]) {
[[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"]];
}

}

- (void)triggerTimeout:(NSString *)appid ret:(NSString *)ret arg:(NSString *)arg
{

double interval = [arg doubleValue]/1000.0f;
if(WXFloatEqual(interval,0)) {
return;
}
if(![_timers containsObject:appid]){
[_timers addObject:appid];
}
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:arg forKey:@"arg"];
[self performSelector:@selector(callBack:) withObject:dic ];
});
}

- (void)triggerInterval:(NSString *)appid ret:(NSString *)ret arg:(NSString *)arg
{
double interval = [arg doubleValue]/1000.0f;
if(WXFloatEqual(interval,0)) {
return;
}
if(![_timers containsObject:appid]){
[_timers addObject:appid];
}
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:arg forKey:@"arg"];
[self performSelector:@selector(callBackInterval:) withObject:dic ];
});
}

@end
5 changes: 5 additions & 0 deletions ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componen
*/
- (void)resetEnvironment;

/**
* Remove instance's timer.
*/
-(void)removeTimers:(NSString *)instance;

@optional

/**
Expand Down