Почему NSAppleScript compileAndReturnError всегда успешно выполняется? - PullRequest
2 голосов
/ 04 июня 2009

Учитывая, что NSAppleScript объекты всегда должны выполняться в главном потоке, я создал небольшой прокси-объект для использования:

@interface AppleScriptProxy : NSObject {
    NSAppleScript *m_script;
    NSDictionary *m_errorDict;
}

- (id) init;

- (void) compileScript:
    (NSString*)script;

- (void) dealloc;

- (NSDictionary*) errorDict;

- (BOOL) failed;

- (void) runScript:
    (id)notUsed;

@end

@implementation AppleScriptProxy

- (id) init
{
    self = [super init];
    m_errorDict = nil;
    m_script = nil;
    return self;
}

- (void) dealloc
{
    //[m_errorDict release];
    [m_script release];
    [super dealloc];
}

- (void) compileScript:
    (NSString*)source
{
    m_script = [[NSAppleScript alloc] initWithSource:source];
    if ( m_script )
        if ( [m_script compileAndReturnError:&m_errorDict] ) {
            cerr << "compiled" << endl;
            [m_script retain];
        } else {
            cerr << "not compiled" << endl;
            m_script = nil;
        }
}

- (NSDictionary*) errorDict
{
    return m_errorDict;
}

- (BOOL) failed
{
    return !m_script || m_errorDict;
}

- (void) runScript:
    (id)notUsed
{
    [m_script executeAndReturnError:nil];
}

@end

Затем, чтобы скомпилировать и выполнить AppleScript:

NSString *const script = /* some script */;

[proxy
    performSelectorOnMainThread:@selector(compileScript:)
    withObject:script waitUntilDone:YES];

if ( [proxy failed] ) {
    NSDictionary *errorDict = [proxy errorDict];
    NSString const *const errorMsg = errorDict ?
        [errorDict objectForKey:NSAppleScriptErrorMessage] :
        @"NSAppleScript initWithSource failed";
    cerr << [errorMsg UTF8String] << endl;
    return 1;
}

[proxy retain];
[proxy
    performSelectorOnMainThread:@selector(runScript:)
    withObject:nil waitUntilDone:NO];
[proxy autorelease];

Если я скомпилирую действительный скрипт, он будет работать как положено; тем не менее, если я скомпилирую скриптовый скрипт, например, «foo», compileAndReturnError не завершится с ошибкой, то есть он вернет YES, а m_errorDict по-прежнему nil.

Почему?

1 Ответ

1 голос
/ 04 июня 2009

Попробуйте в редакторе скриптов. «Foo» компилируется просто отлично; это просто не работает.

Попробуйте «*» в качестве сценария тестирования компиляции.

Кстати, запуск сценария также может вызвать ошибку (как вы можете видеть в Редакторе сценариев). Убедитесь, что вы справились с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...