2 Stimmen

JavaScriptCore externe Arrays

Ich habe mit JavaScriptCore für iOS herumgespielt und versucht, herauszufinden, wie ich etwas ähnliches wie "SetIndexedPropertiesToExternalArrayData" von v8 machen kann, wo ich ein JavaScript-Objekt habe und seine Array-Daten auf ein anderes Array eines anderen Objekts setzen könnte. Zum Beispiel, wenn ich ein leeres JavaScript-Objekt hätte und ein anderes JavaScript-Objekt, das so aussah:

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

Und wenn ich das leere JavaScript-Objekt auf das Array-Objekt zeigen lassen würde, dann würde jedes Mal, wenn ich den [] Operator des [früher leeren] Arrays aufrufe, es dieselben Werte wie das Array des anderen JavaScript-Objekts enthalten.

Ich habe versucht, damit herumzuspielen und verschiedene Dinge ausprobiert, aber bisher keinen Weg gefunden, dies zu tun. Mein Endziel dabei ist es, in iOS typisierte Arrays zu erstellen, aber soweit ich weiß, sind externe Arrays und typisierte Arrays in der iOS-Version von JavaScriptCore nicht vorhanden?

Vielen Dank im Voraus.

0voto

Mike Punkte 3722

Der folgende IOS-Code zeigt ein Beispiel dafür, wie Schlüssel-Arrays von einem Objekt in ein anderes innerhalb von JavaScriptCore für iOS zugewiesen und dann der Array-Operator auf dem Zielobjekt nach dem Kopieren verwendet wird. Ich habe auch gezeigt, wie man diese Objekte zwischen IOS Objective-C und JavaScriptCore sowohl als separate Javascript-Objekte, die von Objective-C gesetzt wurden, als auch indem das Objekt als Parameter an eine Javascript-Funktion übergeben wird.

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);

Wenn Sie diesen Code kopieren, entfernen Sie bitte die eingebetteten Zeilenumbrüche in der Zeichenfolge, die die Javascript-Funktion enthält (ich habe diese für die Klarheit hinzugefügt).

Dieser Code gibt die folgende Konsolenausgabe zurück:

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;
}

Wie Sie am Beispielcode sehen können, bietet das IOS JavaScriptCore-Framework eine integrierte Konvertierung zwischen dem NSDictionary-Objekt und Javascript-Arrays. Wenn man sich JSValue.h ansieht, beschreibt es diese integrierte Konvertierung als: NSDictionary konvertiert zu einem JavaScript-"Objekt", aber der Array-Operator funktioniert einwandfrei bei Werten, die von Objective-C injiziert wurden, und das für ein neues Javascript-Schlüssel-Array zurückgegebene Objekt ist ein gültiges NSDictionary-Objekt in Objective-C.

Löst das Ihr Problem oder habe ich es falsch verstanden?

0voto

Tayschrenn Punkte 1202

Die JavaScriptCore-Build, der mit iOS 7 geliefert wird, hat typed arrays, aber leider stellt die öffentliche API diese nicht zur Verfügung, sodass du nicht auf ihre Daten zugreifen kannst. Allerdings gibt es diesen iOS-spezifischen Fork von JavaScriptCore der eine öffentliche Wrapper um die typed arrays API enthält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X