我正在將一些執行AppleScripts的代碼從NSAppleScript遷移到NSUserAppleScriptTask,以便我可以對我的應用程序進行沙盒處理。執行腳本如何排隊NSUserAppleScriptTask執行?
的AppleScript的「test.scpt」簡直是
on run
display dialog "Hello World" buttons {"OK"} default button "OK"
end run
如果我在一排NSAppleScript如下執行這個10倍,:我遇到的問題可以最好證明如下10次,每次執行都等待上一次執行完成。
NSURL *script = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"scpt"]];
for (int i=0; i<10; i++) {
NSDictionary *error = nil;
NSAppleScript *task = [[NSAppleScript alloc] initWithContentsOfURL:script error:nil];
[task executeAndReturnError:&error];
if (error!=nil) {
NSLog(@"AppleScript error: %@", error);
}
[task release];
}
但是使用NSUserAppleScriptTask,它顯示任務是同時執行的。併發執行是一個「問題」,因爲如果前面的腳本的對話框打開,下一個要執行的腳本錯誤。這可以如下面所示:
NSURL *script = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"scpt"]];
for (int i=0; i<10; i++) {
NSError *error;
NSUserAppleScriptTask *task = [[NSUserAppleScriptTask alloc] initWithURL:script error:&error];
[task executeWithCompletionHandler:^(NSError *error) {
if (error){
NSLog(@"Script execution failed with error: %@", [error localizedDescription]);
}
}];
[task release];
}
這生成9以下錯誤出10所執行的:
execution error: "Hello World" doesn’t understand the «event sysodlog» message. (-1708)
我認爲正確的解決方案將是隊列使用GCD或NSOperationQueue每個操作但我沒有設法構建一個隊列,等待NSUserAppleScriptTask的完成塊在其開始下一個任務之前執行。
任何人都可以提出一個解決方案,會給我與NSAppleScript方法給我一樣的行爲嗎?
您可以使用任務的完成處理程序開始執行下一個任務。 –
這可能比我的更好(更直接)的解決方案。 – omz