OC和JS的交互---JavaScriptCore

JavaScriptCore的简单介绍

JavaScriptCore是iOS7提供的原生框架,可以让Objective-C和JavaScript提供简单直接的交互。

 

JavaScriptCore的使用

导入JavaScriptCore.framework

在需要使用的类中引入头文件

#import <JavaScriptCore/JavaScriptCore.h>

点开头文件,我们可以看到

#import "JSContext.h"
#import "JSValue.h"
#import "JSManagedValue.h"
#import "JSVirtualMachine.h"
#import "JSExport.h"

这些都是框架的时候会使用到的东西。

 

通过OC执行JS方法或调取JS属性

复制代码
    //通过OC执行js方法或调取js属性。
    JSContext *context = [[JSContext alloc]init];
    [context evaluateScript:@"var arr = [1, 2, 'This is js string'];var sum = function(a, b) { return a+b;}"];
    //访问js中定义的数组arr
    JSValue *jsArr = context[@"arr"];
    NSArray *ocArr = jsArr.toArray;
    NSLog(@"%@",ocArr);
    
    //执行js中定义的方法,传入参数并得到结果
    JSValue *jsSum = context[@"sum"];
    JSValue *jsSumResult = [jsSum callWithArguments:@[@2,@3]];
    NSInteger sumResult = jsSumResult.toInt32;
    NSLog(@"%d",(int)sumResult);
复制代码

JSContext对象:

  它是JS的运行环境,它有一个方法-evaluateScript,这个方法可以运行一段js代码。而且,js中的所有变量方法都会保存在JSContext中,通过操作JSContext对象,可以实现调用js的方法和存取js的对象。

 

JSValue对象:

  它对应着JSContext中的所有方法和属性,它也是OC和JS相互访问和修改的中间体,所有OC 和 javaScript的跨语言操作都要通过JSValue一些方法进行。

NSNumber *jsarr0 = jsArr[0].toNumber;
jsArr[1] = @3;

  通过JSValue对象的 callWithArguments:方法来直接调取 js 的 function。js function的多参数,在OC中,由NSArray组装而成。

    //执行js中定义的方法,传入参数并得到结果
    JSValue *jsSum = context[@"sum"];
    JSValue *jsSumResult = [jsSum callWithArguments:@[@2,@3]];
//    JSValue *jsSumResult = [jsSum callWithArguments:[NSArray arrayWithObjects:@2, @3, nil]];
    //jsSumResult = 5;

 

通过JS执行OC方法,或者调用OC属性

我们可以使用Block来调用方法

复制代码
-(NSInteger) sumWithA:(NSInteger)a WithB:(NSInteger)b WithC:(NSInteger)c{
    return a+b+c;
}

-(void)test{
    JSContext *context = [[JSContext alloc]init];
    context[@"sumNums"] = ^(NSInteger a,NSInteger b,NSInteger c){
        return [self sumWithA:a WithB:b WithC:c];
    };
    
    JSValue *sum = [context evaluateScript:@"sumNums(7, 56, 22)"];
    NSLog(@"%@",sum);
}
复制代码

上述代码中,sumWithA:WithB:WithC 是我们定义的OC的方法,在JS调用OC方法时,首先声明一个JSContext对象,然后对sumNums赋值一个Block,在Block中,我们调用OC定义的方法sumWithA:WithB:WithC。我们使用evaluateScript来执行一段JS代码,尝试调用OC方法,最后输出结果。

1. 不论在任何情况下,不要在Block中直接使用外面的JSValue对象, 而应该把JSValue当做参数来传进Block中。
2. 不论在任何情况下,不要在Block中直接使用外面的JSContext对象, 而应该使用 [JSContext currentContext]获取。

posted @   Nuius  阅读(806)  评论(0)    收藏  举报
编辑推荐:
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
阅读排行:
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· .NET Core中的配置Configuration实战
点击右上角即可分享
微信分享提示