NSRunAlertPanel导致多线程性能问题

时间:2013-07-18 02:23:01

标签: objective-c cocoa nsalert nsrunalertpanel

有时我必须在我的Cocoa代码段中执行弹出警报窗口。之前我直接使用了NSAlert,然后runModal去了,而我发现NSRunAlertPanel更容易实现我的目标。所以我决定将所有警报功能切换到NSRunAlertPanel。它在大多数时候似乎没问题。

现在我正在添加多线程。我发现在主线程中回调时NSRunAlertPanel显然比NSAlert明显慢。

代码段:

首先我创建一个帖子:

[NSThread detachNewThreadSelector: @selector(tryRunLoop:) toTarget:self withObject:nil];

然后,此线程中的此函数tryRunLoop调用主线程中的警报窗口函数:

while(1)
[self performSelectorOnMainThread:@selector(showAlert:) withObject:anObject waitUntilDone:YES]; 

主线程中的函数showAlert执行其他操作:

NSRunAlertPanel(@"Warning:",@"Just testing", @"YES", nil, nil);

随着时间的推移,弹出窗口的响应显得越来越慢。如果我使用NSAlert而不是NSRunAlertPanel,或者没有在主线程中运行弹出方法,则症状应该消失。

我还发现这两种方法的CPU使用率也不同。显然,NSAlert在按下按钮的同时会降低CPU使用率。

有人能够解释这些现象吗?

PS:我不允许将整个原始项目放到网上,以便我在Github中创建一个简单的Cocoa项目来模拟症状和URL,请查看Known issues首先在自述文件中。

1 个答案:

答案 0 :(得分:0)

好的,简短的回答是不要使用NSRunAlertPanel。一段时间以来,这一系列功能已被劝阻,并由NSAlert取代。请改用NSAlert

(不幸的是,NSRunAlertPanel等的类引用并没有提到这一点;我试图记住它最初记录的位置;也许是发布说明)