美文网首页
OC与JavaScript的交互

OC与JavaScript的交互

作者: aspmcll | 来源:发表于2017-02-09 19:15 被阅读0次

    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,会引起循环引用。

    相关文章

      网友评论

          本文标题:OC与JavaScript的交互

          本文链接:https://www.haomeiwen.com/subject/vvbiittx.html