NSRunAlertPanel вызвал проблему производительности на многопоточности
Иногда мне приходится делать всплывающее окно с предупреждением в моих сегментах кода Какао. Ранее я использовал 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
или не запустил метод popup в главном потоке, симптом должен исчезнуть.
Я также обнаружил, что загрузка ЦП также различалась между этими двумя методами. очевидно NSAlert
стоит низкое использование процессора при постоянном нажатии кнопки.
Может ли кто-то объяснить эти явления?
PS: мне не разрешили разместить весь оригинальный проект в сети, так что я создал простой проект Cocoa в Github для имитации симптома и URL, пожалуйста, посмотрите на Known issues
сначала в файле Readme.
1 ответ
Хорошо, короткий ответ не использовать NSRunAlertPanel
, Это семейство функций было обескуражено в течение некоторого времени и заменено NSAlert
, использование NSAlert
вместо.
(К сожалению, ссылка на класс для NSRunAlertPanel
и т. д. не упоминает об этом; Я пытаюсь вспомнить, где это было впервые задокументировано; возможно, заметка о выпуске)