应用启动后,NSWindow不会立即抽奖

时间:2016-12-01 05:11:09

标签: xcode macos cocoa splash-screen nswindow

问题:如果立即调用其他处理器密集型非UI代码,尝试显示带有来自applicationWillFinishLaunching的文本的窗口将不会自行绘制。

背景:我有一个帮助应用程序,在启动时可能会或可能不会与最终用户交互。虽然它是'#34;决定"如果它需要设置一个窗口来询问用户的问题,那么可能会有1秒到10秒的时间(在启动之后它会在通过互联网进行通信的非UI功能库代码中关闭)。

因此,我希望善待用户并提出一个"迷你警报" *窗口"工作,请等待......",然后进入库代码,一旦处理完毕,我将解散。

似乎应用程序本身在发布后没有时间绘制这个迷你警报(它只是一个NSWindow,带有NSView,一些文本,没有按钮)。

如果库代码返回并想要为用户提供错误警报或查询窗口 - 那么此时迷你警报将按预期绘制。但是,如果我关闭迷你警报(见下文),然后提出一个NSAlert - 迷你警报没有足够的时间来解雇自己。

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    [NSApp activateIgnoringOtherApps:YES];

    briefAlertWindowController = [[NSWindowController alloc] initWithWindowNibName:@"BriefAlertWindow"];

    [[briefAlertWindowController window] center];
    [briefAlertWindowController showWindow:self ];
    [[briefAlertWindowController window] orderFront:self ];
    [[briefAlertWindowController window] display];
    [[briefAlertWindowController window] makeKeyAndOrderFront:nil];
}

并驳回迷你警报:

- (void)dismissMiniAlert
{
    NSWindow * theWindow = [briefAlertWindowController window];
    [theWindow orderOut:nil];
}

注意,对于此迷你警报,NSWindow和NSWindowController都没有派生/子类。

  • 我使用的术语是"迷你警报",因为我注意到人们对“闪屏”的概念感到恼火。虽然功能类似 - 我真的只是想让用户知道正在进行一项不可避免的长时间操作。

1 个答案:

答案 0 :(得分:3)

这听起来像是一个线程问题。启动窗口无法在主线程上绘制,因为主线程忙于执行处理器密集型操作。正确地说,处理器密集型的东西应该都是在后台线程上发生的。如果你不能做到这一点,你至少需要足够长的主线程来让runloop有机会画出你的窗口。只是引入延迟。