启动外部应用程序并等待它们启动

时间:2011-07-10 22:46:38

标签: objective-c xcode cocoa

我正在尝试推出一系列支持应用。然后,我必须等到这些应用程序完成启动后再继续执行代码。这就是我现在所拥有的:

NSWorkspace *ws = [NSWorkspace sharedWorkspace];
int i = 0;

while (i < [launchApps count]) {
    [ws launcApplication: [launchApps objectAtIndex: i]];
    ++i
}

while (![self appsFinishedLaunching]) {
    NSLog(@"loop");
    sleep(1);
}

然后:

- (BOOL)appsFinishedLaunching
{
    BOOL doneLaunching = NO;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

            int i = 0;
            while (i < [launchApps count]) {
                NSWorkspace *nws = [NSWorkspace sharedWorkspace];
                NSArray *runningApps = [NSArray arrayWithArray:[nws runningApplications]];
                for (NSRunningApplication *app in runningApps) {
                    if ([[app localizedName] isEqualToString:[launchApps objectAtIndex:i]]) {
                        if ([app isFinishedLaunching]) {
                            [launchApps removeObjectAtIndex:i];
                            break;
                        }
                    }
                }
                ++i;
            }
    if ([launchApps count] == 0)
        doneLaunching = YES;

    [pool drain];

    return doneLaunching;
}

如果我手动打开launchApps中的所有应用程序,我会在控制台中获得一个“循环”,一切都很顺利。如果我运行此代码并让它启动应用程序,它将进入无限循环。似乎我的共享工作区中的NSRunningApplications对象没有更新,我不确定我理解为什么。我错过了什么?

1 个答案:

答案 0 :(得分:1)

来自Apple Docs on NSRunningApplication

  

@property(readonly,getter = isFinishedLaunching)BOOL finishedLaunching

     

此属性的值对应于已在内部收到NSApplicationDidFinishLaunchingNotification通知的正在运行的应用程序。某些应用程序不发布此通知(不依赖于NSApplication的应用程序),因此从未报告为已完成启动。

如果您启动的应用程序未发布通知,则无法使用此属性。

问题是,您尝试启动Cocoa应用程序的应用程序是什么?如果没有,您可能需要调查其他启动功能; C函数exec可能有效,但我还没有调查过。