超时功能Obj-C

时间:2015-02-28 19:37:14

标签: objective-c timeout

我有一个方法需要在用户设置的时间限制内返回,有没有办法在Obj-C(或我可以遵循的通用模式)中这样做,假设超时值已经从用户并在代码中随时可用作变量吗?

更新:需要超时的代码:

NSRunningApplication app = [[NSRunningApplication runningApplicationsWithBundleIdentifier:[bundle bundleIdentifier]] objectAtIndex:0];
while (![app isFinishedLaunching])
{
     sleep(1);
}

2 个答案:

答案 0 :(得分:0)

就个人而言,我不会倾向于轮询该应用程序是否已完成启动。我可能会为启动应用程序添加一个观察者,然后启动计时器,看看是否首先调用计时器或观察者是否这样做。例如:

  1. 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];
        }
    }];
    
  2. 创建计时器属性:

    @property (nonatomic, weak) NSTimer *timer;
    
  3. 启动应用

  4. 启动计时器:

    self.timer = [NSTimer scheduledTimerWithTimeInterval:self.timeoutInterval target:self selector:@selector(handleTimer:) userInfo:nil repeats:NO];
    

    因为如果我们收到通知,观察者将使计时器无效,我们现在知道如果调用计时器的选择器,则它不会在先决条件时间内启动。

    < / LI>
  5. 顺便说一句,请务必删除dealloc上的观察者:

    - (void)dealloc {
        NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];
    
        [center removeObserver:self.didLaunchObserver];
    }
    
  6. 显然,如果应用可能已经在运行,那么你应该检查并处理它。但上面是一个事件驱动方法的例子,用于确定何时启动应用程序。

    有关轮询替代方案的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);
}