2014-02-06 5 views
2

저는 iOS 용 JavaScriptCore를 사용하고 있습니다. 저는 "javascript 객체가있는"v8에서 "SetIndexedPropertiesToExternalArrayData"라인을 따라 뭔가를 수행하는 방법을 찾아 내려고 노력했습니다. 다른 객체의 배열을 가리키는 배열 데이터입니다. 내가했다 예를 들어, 빈 자바 스크립트 객체를 가지고 있고,하는 모습 또 다른 자바 스크립트 객체 :JavaScriptCore 외부 배열

{ '0': 0, '1': 1, '2': 2 }; 

그리고 내가 전화 할 때마다, 배열 객체에 빈 자바 스크립트 객체 지점을했다 경우 [무엇을 예전처럼 비어있는] array [] 연산자는 다른 자바 스크립트의 배열 값과 같습니다.

나는 다른 일에 놀러하려고했는데 내가 그렇게 할 수있는 방법을 찾고 있습니다. 필자의 최종 목표는 iOS에서 형식화 된 배열을 만드는 것이지만, 잘못 입력하지 않으면 JavaScriptCore의 iOS 빌드에 외부 배열과 형식화 된 배열이 존재하지 않습니다.

미리 감사드립니다.

답변

0

다음 IOS 코드는 iOS의 경우 키 코드 된 배열을 다른 개체의 JavaScriptCore에 할당 한 다음 복사 후 대상 개체의 배열 연산자를 사용하는 예를 보여줍니다. I는 이산 자바 스크립트는 자바 스크립트 함수의 매개 변수로 오브젝트를 전달뿐만 아니라 목표-C에서 개체를 설정 IOS 모두 같은 목적-C 사이 및 JavaScriptCore는 이러한 객체를 전달 도시했다. 이 코드를 복사하려는 경우

JSContext *javascriptContext = [[JSContext alloc] init]; 
javascriptContext[@"consoleLog"] = ^(NSString *message) { 
    NSLog(@"Javascript log: %@",message); 
}; 

NSDictionary *myArray = [NSDictionary dictionaryWithObjectsAndKeys:@0, @"item0", @1, @"item1", @2, @"item2", nil]; 
NSLog(@"myArray = %@", myArray); 
javascriptContext[@"obj1"] = myArray; 
[javascriptContext evaluateScript:@"var myFunction = function(arrayArg) { 
    consoleLog(\"obj1['item2'] = \" + obj1['item2']); 
    consoleLog(\"arrayArg['item0'] = \" + arrayArg['item0']); 
    var obj2 = obj1; 
    consoleLog(\"obj2['item1'] = \" + obj2['item1']); 
    obj1 = { 'key0': 0, 'key1': 1, 'key2': 2 }; 
    obj2 = obj1; 
    consoleLog(\"obj2['key0'] = \" + obj2['key0']); 
    return obj2; 
};"]; 
JSValue *function = javascriptContext[@"myFunction"]; 
NSArray *argList = [NSArray arrayWithObjects:myArray, nil]; 
JSValue *result = [function callWithArguments:argList]; 
NSDictionary *javascriptArray = [result toObject]; 
NSLog(@"javascriptArray returned = %@", javascriptArray); 

는 자바 스크립트 함수 (나는 명확하게 이러한 추가)가 포함 된 문자열에 포함 된 개행 문자를 제거하십시오.

이 코드는 다음과 같은 콘솔 로그를 생성합니다 샘플 코드에서 볼 수 있듯이, IOS JavaScriptCore는 프레임 워크가 제공

2014-02-07 16:49:55.901 TestHarness[4674:70b] myArray = { 
    item0 = 0; 
    item1 = 1; 
    item2 = 2; 
} 
2014-02-07 16:49:55.903 TestHarness[4674:70b] Javascript log: obj1['item2'] = 2 
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: arrayArg['item0'] = 0 
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['item1'] = 1 
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['key0'] = 0 
2014-02-07 16:49:55.905 TestHarness[4674:70b] javascriptArray returned = { 
    key0 = 0; 
    key1 = 1; 
    key2 = 2; 
} 

내장있는 NSDictionary 객체와 자바 스크립트 배열 사이의 전환을 가능하게한다. 는 NSDictionary는 자바 스크립트 "개체"로 변환했지만 배열 연산자 오브젝티브 C로부터 분사 값에 잘 작동하고, 객체가 새로운 자바 키홈 ​​배열 리턴 유효 :로 JSValue.h 찾고 그것을이 내장 변환을 설명 Objective-C의 NSDictionary 객체

이 질문이 해결되었거나 오해가 있습니까?

+0

배열을 JavaScript 객체에 할당 한 후 Objective-C 외부 배열의 한 요소를 변경하는 추가 실험은 JavaScriptCore가 외부 배열의 점이 아닌 배열 내용의 복사본을 사용한다는 것을 보여줍니다 (변경 사항은 표시되지 않음) . 내 대답이 당신의 문제를 해결할 것이라고 생각하지 않습니다. – Mike

+0

그래, 도움에 감사하지만, 불행히도이 문제는 해결되지 않습니다. 당신은 JavaScriptCore에 관한 한, 객관적인 -c에서 배열을 복사하고, 하나의 javascript 객체의 배열 포인트를 다른 배열로 만들려고하는 것이 불가능한 것처럼 보입니다. 나는 아직도이 일을하는 방법을 찾아 내려고 노력하고 있지만, 지금까지 행운이 없었다. – iNightfaller

+0

나는 색인화 된 배열에 대해서만이 작업을하려고한다는 것을 지적하고자한다. "함수"와 다른 데이터가 필요로하는 객체와 같은 다른 객체를 포함하는 몇 가지 자바 스크립트 클래스가 있으므로 인덱스 된 부분 만 다른 배열을 가리 키도록하려는 것은 힘들 것 같습니다. – iNightfaller

0

iOS 7과 함께 제공되는 JavaScriptCore의 빌드에는 입력 된 배열이 있지만 불행히도 공개 API는 노출되지 않으므로 네이티브에서 데이터를 건드릴 수 없습니다. 그러나 형식화 된 배열 API를 공용 랩퍼로 표시하는 there's this iOS-specific fork of JavaScriptCore.

관련 문제