Xcode 北韩元';t在应用程序启动后立即绘制

Xcode 北韩元';t在应用程序启动后立即绘制,xcode,macos,cocoa,splash-screen,nswindow,Xcode,Macos,Cocoa,Splash Screen,Nswindow,问题:如果立即调用其他处理器密集型非UI代码,则尝试显示包含applicationWillFinishLaunching中文本的窗口不会自动绘制 背景:我有一个助手应用程序,启动时可能与最终用户交互,也可能不与最终用户交互。虽然它正在“决定”是否需要打开一个窗口来询问用户问题,但可能需要1秒到10秒的时间(启动后,它在通过internet进行通信的不支持UI的库代码中关闭) 因此,我想对用户友好一点,在进入该库代码之前,我会弹出一个带有“正在工作,请稍候…”的“迷你警报”窗口,一旦处理完成,我会

问题:如果立即调用其他处理器密集型非UI代码,则尝试显示包含applicationWillFinishLaunching中文本的窗口不会自动绘制

背景:我有一个助手应用程序,启动时可能与最终用户交互,也可能不与最终用户交互。虽然它正在“决定”是否需要打开一个窗口来询问用户问题,但可能需要1秒到10秒的时间(启动后,它在通过internet进行通信的不支持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均未为此小警报派生/子类

  • 我使用“迷你警报”这个词,因为我注意到人们对“闪屏”的概念感到恼火。虽然功能类似,但我只是想让用户知道,不可避免的长操作正在发生

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

      你显然是对的,我只需要稍微延迟一下,然后再继续。有没有关于如何最好地引入一个不会阻塞运行循环的延迟的建议?我尝试了sleep(n),但显然不起作用。通常的方法是
      dispatch\u after
      。或者
      performSelector:afterDelay:
      。但是请注意,我所说的关于从主线程中获取处理器密集型内容的内容仍然有效。按住主线程10秒将旋转死亡比萨饼,用户将无法执行任何操作,甚至无法退出。这在迷你警报的初始显示中非常有效。对于解雇,在展示一个真实的NSAlert之前先介绍一个简短的睡眠()是有效的。别误会我的意思,我很高兴你克服了最初的困难。但困难重重的事实仍然是一个警告信号。