我有一个方法需要在用户设置的时间限制内返回,有没有办法在Obj-C(或我可以遵循的通用模式)中这样做,假设超时值已经从用户并在代码中随时可用作变量吗?
更新:需要超时的代码:
NSRunningApplication app = [[NSRunningApplication runningApplicationsWithBundleIdentifier:[bundle bundleIdentifier]] objectAtIndex:0];
while (![app isFinishedLaunching])
{
sleep(1);
}
答案 0 :(得分:0)
就个人而言,我不会倾向于轮询该应用程序是否已完成启动。我可能会为启动应用程序添加一个观察者,然后启动计时器,看看是否首先调用计时器或观察者是否这样做。例如:
为NSWorkspaceDidLaunchApplicationNotification
创建一个有问题的包标识符的观察者:
@property (nonatomic, weak) id<NSObject> didLaunchObserver;
和
typeof(self) __weak weakSelf = self;
NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];
self.didLaunchObserver = [center addObserverForName:NSWorkspaceDidLaunchApplicationNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
if ([note.userInfo[@"NSApplicationBundleIdentifier"] isEqualToString:weakSelf.bundleIdentifier]) {
[weakSelf.timer invalidate];
}
}];
创建计时器属性:
@property (nonatomic, weak) NSTimer *timer;
启动应用
启动计时器:
self.timer = [NSTimer scheduledTimerWithTimeInterval:self.timeoutInterval target:self selector:@selector(handleTimer:) userInfo:nil repeats:NO];
因为如果我们收到通知,观察者将使计时器无效,我们现在知道如果调用计时器的选择器,则它不会在先决条件时间内启动。
< / LI>顺便说一句,请务必删除dealloc
上的观察者:
- (void)dealloc {
NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];
[center removeObserver:self.didLaunchObserver];
}
显然,如果应用可能已经在运行,那么你应该检查并处理它。但上面是一个事件驱动方法的例子,用于确定何时启动应用程序。
有关轮询替代方案的Apple讨论,请参阅Technical Note TN2050: Observing Process Lifetimes Without Polling。
答案 1 :(得分:-1)
我明白了,这是我实施的方式
NSDate *start = [NSDate date];
app = [[NSRunningApplication runningApplicationsWithBundleIdentifier:[bundle bundleIdentifier]] objectAtIndex:0];
while (![app isFinishedLaunching])
{
if(fabs([start timeIntervalSinceNow]) > timeout)
return;
sleep(1);
}