OCとJSのインタラクション---JavaScriptCore

4099 ワード

JavaScriptCoreの簡単な紹介
JavaScriptCoreはiOS 7が提供するオリジナルのフレームワークで、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);

JSSContextオブジェクト:
JSの実行環境で、jsコードを実行する方法-evaluateScriptがあります.また、js内のすべての変数メソッドはJSCoextに保存され、JSCoextオブジェクトを操作することで、jsを呼び出すメソッドとjsにアクセスするオブジェクトを実現できます.
 
JSValueオブジェクト:
それはJSCoextの中のすべての方法と属性に対応して、それは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メソッドを呼び出すときに、まずJSCoextオブジェクトを宣言し、sumNumsにBlockを付与し、BlockではOC定義のメソッドsumWithA:WithB:WithCを呼び出す.evaluateScriptを使用してJSコードを実行し、OCメソッドを呼び出し、結果を出力しようとします.
1.いずれの場合も、Blockで外部のJSValueオブジェクトを直接使用するのではなく、JSValueをパラメータとしてBlockに転送する必要があります.2.いずれの場合も、Blockで外部のJSCoextオブジェクトを直接使用するのではなく、[JSCoext currentContext]を使用して取得する必要があります.