objective-c – 主线程之外的NSRunAlertPanel()?

前端之家收集整理的这篇文章主要介绍了objective-c – 主线程之外的NSRunAlertPanel()?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_6@ 我偶然发现了我正在使用 cocoa开发的应用程序中的一个问题.
我需要做一些处理,我在一个单独的线程上做.我这样做,所以我可以使用NSProgressIndicator显示进度,而不是挂起主线程. (如果他/她想要,用户可以取消执行).

它几乎完美地工作,但是有一个问题:处理产生了大量文件,如果这些文件中有一个或多个已经存在,我想询问用户是否可以在实际操作之前覆盖它们.所以我尝试使用处理线程中的NSRunAlertPanel().

它有时会起作用.其他时候,警报面板会闪烁,在我点击之前没有特殊原因关闭,或根本不显示.所以我认为NSRunAlertPanel()可能不是线程安全的,并且由于竞争条件而导致这种情况变得很糟糕.

我想知道:除了不断地使用计时器从主线程轮询处理线程的进度之外,有没有办法可以解决这个问题?

是从其他任何线程使用GUI主要的一个固有的不安全?

提前致谢.

编辑:我正在遵循马克的指示,但仍然有问题,因为我的NSAlerts(我现在也在使用)仍在消失.这是我的处理线程.

- (void)doProcess:(id)param
{
    // ...
    [self performSelectorOnMainThread:@selector(askForConfirmation) withObject:nil waitUntilDone:YES];
    // ...
}

然后在我的主线程上:

- (void)askForConfirmation
{
    [[NSAlert alertWithMessageText:@"Test." defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Testing."] runModal];
}

- (IBAction)startProcessing:(id)sender
{
    // ...
    [NSThread detachNewThreadSelector:@selector(doProcess:) toTarget:self withObject:nil];
    // ...
}

解决方法

主线程是GUI线程.你不应该在任何后台线程上做任何GUI的东西.话虽这么说,你可以编写一个调用NSRunAlertPanel()的方法,然后使用NSObject的performSelectorOnMainThread:方法之一调用你的方法.

要检查您当前是否正在主线程上执行,您只需调用[NSThread isMainThread]即可.

猜你在找的cocoa相关文章