如何快速获取应用程序终止通知cocoa

时间:2011-12-09 12:38:59

标签: objective-c cocoa notifications

要获得应用程序终止通知,我有类似以下内容

 NSNotificationCenter*  center = [[NSWorkspace sharedWorkspace] notificationCenter];

    [center addObserver:self 
               selector:@selector(appTerminated:) 
                   name:NSWorkspaceDidTerminateApplicationNotification 
                 object:nil
     ];




- (void)appTerminated:(NSNotification *)note
{
    NSLog(@"+ appTerminated");
}

实际上我担心的是当firefox应用程序退出/重启时,我需要更新它的数据库。当firefox手动退出时,我可以在appTerminated的帮助下更新为firefox释放其对数据库的锁定。当它运行状态时,我无法更新数据库,因为firefox正在锁定它。当firefox重新启动时,它正在退出并重新启动太快,以至于我无法更新数据库,因为它处于运行状态我需要在重新启动之前更新数据库。 firefox处于退出状态。

所以,我需要在firefox退出之前通知。 有没有api可用于此或请提出一些想法。

提前致谢

2 个答案:

答案 0 :(得分:2)

我认为你有两个应用程序,一个用于监视另一个应用程序。您的担心似乎是,在观察者完成工作之前,您不希望被监视的应用程序开始真正做任何事情。

在这种情况下,您只需要在进程之间进行通信。观看的应用程序应该等到观察者完成其工作。您可以使用锁来实现此目的,或者您可以使用NSDistributedNotification(或其他IPC机制)将来自观察者的消息发送给观察者,以让它知道它可以继续。

我更喜欢锁定机制,因为如果观察者失败,它的行为正确。放置锁的最正确的地方是数据库,因为这是你想要保护的资源。

答案 1 :(得分:2)

我会尝试这样的事情:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    if (isMyDatabaseClosed) {
         [self closeMyDatabaseAndQuit];
         return NSTerminateLater;
    } else {
         return NSTerminateNow;
    }
}

-(void)closeMyDatabaseAndQuit 
{
/* close your database, etc...*/
    [NSApp replyToApplicationShouldTerminate: YES];
}

代码未经过测试,但你应该知道。