Передача NSArray, заполненного NSDictionaries, в NSAppleScript - PullRequest
3 голосов
/ 26 августа 2011

Итак, у меня есть Apple Script, который выполняет одну из функций моей программы, например:

[ NSThread detachNewThreadSelector:@selector(runAppleScriptTask)
                          toTarget:self
                        withObject:nil];

Используя этот метод:

-(void)runAppleScriptTask
{
    mainBundle = [NSBundle bundleForClass:[self class]];
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSDictionary* errorDict;
    NSAppleEventDescriptor* returnDescriptor = NULL;
    NSString *scriptPath = [[NSBundle mainBundle] pathForResource: @"AttemptToRepair"
                                                           ofType: @"scpt"];

    NSLog(@"Found AppleScript Path:%@",scriptPath);

    // Run the Apple Script
    NSAppleScript *scriptObject = [[NSAppleScript alloc]initWithContentsOfURL:[NSURL fileURLWithPath: scriptPath]
                                                                        error:&errorDict];
    returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
    NSLog(@"Return Discriptor,%@",returnDescriptor);

    NSString *returnValue = @"User Canceled";
    NSMutableDictionary *returnDict  = [[NSMutableDictionary alloc] init];

    if ([ returnDescriptor stringValue]) {
        returnValue = [ returnDescriptor stringValue];
        [ returnDict setValue:returnValue forKey:@"returnValue"];
    }
    else {
        if (errorDict) {
            returnValue = [ returnDescriptor stringValue];
            [ returnDict setValue:errorDict forKey:@"errorDict"];
        }
    }





    NSLog(@"Found Return Value: %@",returnValue);

    [scriptObject release];

    // Notify 
    [[NSNotificationCenter defaultCenter]
     postNotificationName:AttemptToRepairCompleteNotification
     object:self
     userInfo:returnDict];
    [pool drain];
}

У меня есть NSArray(Полный статусов), который мне нужно передать в Apple Script.Прямо сейчас я выгружаю файл в список:

// File Drop the Global Status Array
BOOL gsaWroteSuccess = [ issueFile writeToFile:@"/private/tmp/gsa.plist" atomically:YES];
if (gsaWroteSuccess) {
    NSLog(@"Wrote the current Global Status Array to file");

    // Let objects know the Global Status is being updated
    NSMutableDictionary *globalStatusUpdate = [[NSMutableDictionary alloc] init];
    // Pass the mutated Data to our NSTable
    [ globalStatusUpdate setValue:issueFile forKey:@"globalStatusArray"];
    [[NSNotificationCenter defaultCenter]
     postNotificationName:StatusUpdateNotification
     object:self
     userInfo:globalStatusUpdate];
}
else {
    NSLog(@"Unable to write Global Status Array to file");
}

, который я могу легко найти в Apple Script через инфраструктуру системных событий plist, но я действительно предпочел бы сделать все это в оперативной памяти.Теперь я думаю, что мог бы использовать синтаксис свойства, упомянутый здесь, http://developer.apple.com/library/mac/#releasenotes/ScriptingAutomation/RN-AppleScriptObjC/_index.html, но мне нужно, чтобы это работало на 10.5,10.6 и 10.7, поэтому я не могу использовать то, что еще не было выпущено.Есть какие-нибудь мысли о том, как на основе памяти использовать способ передачи NSArray полных или NSDicitonary объектов в мой Apple Script (который станет списком в Apple Script)?

Вот код Apple Script дляметодология удаления файлов прямо сейчас, если это поможет

script AttemptToRepair
    property parent : class "NSObject"
    activate
    set thePListPath to POSIX path of "/tmp/gsa.plist"
    tell application "System Events"

        set the plist_path to "/tmp/gsa.plist"
        set the plist_file to property list file plist_path

        set itemNodes to property list items of property list item "globalStatusArray" of plist_file


        repeat with i from 1 to number of items in itemNodes

            set itemNode to item i of itemNodes

            set discription to value of property list item "discription" of itemNode
            set metric to value of property list item "metric" of itemNode
            set reason to value of property list item "reason" of itemNode
            set status to value of property list item "status" of itemNode
            display dialog "discription:" & discription & return & ¬
                "metric:" & metric & return & ¬
                "reason:" & reason & return & ¬
                "status:" & status
        end repeat

    end tell
end script
run AttemptToRepair
...