OC与JavaScript的交互

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

@property (nonatomic,retain) NSMutableArray *urls;
-(void)addUrlToArray:(NSString *)url;

@end
定义一个遵守了CLJSObjectProtolx协议的对象
@interface CLJSObject : NSObject
@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中

你可能感兴趣的:(OC与JavaScript的交互)