我正在尝试推出一系列支持应用。然后,我必须等到这些应用程序完成启动后再继续执行代码。这就是我现在所拥有的:
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对象没有更新,我不确定我理解为什么。我错过了什么?
答案 0 :(得分:1)
来自Apple Docs on NSRunningApplication:
@property(readonly,getter = isFinishedLaunching)BOOL finishedLaunching
此属性的值对应于已在内部收到NSApplicationDidFinishLaunchingNotification通知的正在运行的应用程序。某些应用程序不发布此通知(不依赖于NSApplication的应用程序),因此从未报告为已完成启动。
如果您启动的应用程序未发布通知,则无法使用此属性。
问题是,您尝试启动Cocoa应用程序的应用程序是什么?如果没有,您可能需要调查其他启动功能; C函数exec
可能有效,但我还没有调查过。