有时我必须在我的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
首先在自述文件中。
答案 0 :(得分:0)
好的,简短的回答是不要使用NSRunAlertPanel
。一段时间以来,这一系列功能已被劝阻,并由NSAlert
取代。请改用NSAlert
。
(不幸的是,NSRunAlertPanel
等的类引用并没有提到这一点;我试图记住它最初记录的位置;也许是发布说明)