oc与javaScript的交互。
基本类型转换
通过JSValue可以把js对象转为OC的对象
JSContext *context = [JSContext alloc] init];
JSValue *jsVal = [context evaluateScript:@“21+7”];
int oval = [jsVal to Int32];
还可以存一个JavaScript的变量在JSContext中,然后通过对于的Key来获得。
[context evaluateScript:@"var arr = [21, 7 , 'iderzheng.com'];"];
3 JSValue *jsArr = context[@"arr"]; // Get array from JSContext
方法的转换
各种数据类型可以转换,Objective-C的Block也可以传入JSContext中当做JavaScript的方法使用。
context[@“log”] = ^() {
NSLog(@“+++Begin Log+++”);
NSArray *args = [JSContext currentArguments];
for(JSValue *js in args){
NSLog(@“%@”,[js toString]);
}
JSValue *this = [JSContext currentThis];
}
[context evaluateScript:@“log(‘snow’,[7,21].{hello:’world’,js:100};)”,前面定义的block将会被调用
Block可以传入JSContext作方法,但是JSValue没有toBlock方法把JavaScript方法变成Block在OC中使用。
但是JSValue提供了-(JSValue *)callWithArguments:(NSArray *)arguments;发放可以反过来讲参数传进来调用方法。
还提供了-(JSValue *)invokeMethod:(NSString *)method withArgumnets:(NSArray *)arguments;让我们可以直接简单地调用对象上的方法。
异常处理
在JSContext中执行的JavaScript如果出现异常,只会被JSContext捕获并存储在exception属性上,而不会向外抛出。时时刻刻检查exception是否为nil显然不合适,更合理的方式是给JSContext对象设置exceptionHander,它接受的是^(JSContext *context,JSValue *exceptionValue)形式的Block,
OC对象到JS
在OC生成的数据想要在JS中访问,需要借助JSExport这个协议
自定义一个协议继承自JSExport,在协议中声明相应的属性和方法,
@protocol CLJSObjectProtol <JSExport>
@property (nonatomic,retain) NSMutableArray *urls;
-(void)addUrlToArray:(NSString *)url;
@end
定义一个遵守了CLJSObjectProtolx协议的对象
@interface CLJSObject : NSObject<CLJSObjectProtol>
@end
@implementation CLJSObject
@synthesize urls;
-(void)addUrlToArray:(NSString *)url {
if (!self.urls) {
self.urls = [NSMutableArray array];
}
[self.urls addObject:url];
}
CLJSObject *object = [[CLJSObject alloc] init];
self.context[@"object_oc"] = _object;
在js中
<script>
var url = object_oc.urls[0]
</srcipt>
就可以访问OC中的数据
注意:
在使用block时候,他在javaScript和OC之间的转换建立起更多的桥梁,让互通更方便,无论是把Block传给JSContext对象让其变成JavaScript方法,还是把他赋给exceptionHandler属性,在block内都不要直接使用外部定义的JSContext对象或者JSValue,会引起循环引用。
网友评论