2

я заметил в комментарии на этот пост Overhead of NSNotifications, пользователь JustSid говоритNSNotifications мониторинга

накладные расходы не будут заметны, если приложение не отправляет 30+ за цикл цикла выполнения

Я хотел бы написать небольшой класс-помощник, который отслеживает, сколько NSNotifications было отправлено в текущем цикле цикла цикла, и предупредить меня, если он превышает определенный предварительно настраиваемый номер. Я знаю, что могу регистрироваться для всех уведомлений (передать nil для имени и объекта), но как я могу отслеживать, какой цикл цикла цикла они были отправлены?

+0

ИМХО такой подход кажется подозрительным. Я не видел никаких доказательств того, что использование NSNotificationCenter - это более высокие накладные расходы, чем отправка сообщений непосредственно между объектами. Любые проблемы с производительностью будут специфичны для обработки уведомлений (по сравнению с отправкой). Если у вас есть большое количество объектов, наблюдающих уведомление и/или выполняющих задачи блокировки потоков, которые, очевидно, повлияют на производительность приложения. Вот где я бы сосредоточил время и энергию. @ Замечание JustSid является произвольным и умозрительным. – XJones

ответ

0

Было бы легко иметь категорию в NSNotificationCenter, которая увеличивает некоторое внутреннее целое число при добавлении наблюдателя уведомлений (и, следовательно, уменьшает его при его удалении), но вы должны спросить себя: сколько это стоит?

Если вы считаете, что это какое-то произвольное целое число (скажем, например, 30), то что происходит, когда вы проверяете его на устройстве с большим количеством ограничений памяти и процессора, чем тот, который у вас есть сейчас? Что произойдет, если вы проверите его на устройстве, которое может легко обрабатывать 30 наблюдателей и уведомлений, плавающих вокруг (это будет полная трата)? Хотя можно было бы кодировать общие правила, было бы невозможно оценить влияние на уведомления о влиянии на время отклика приложения в каждом случае.

Другая возможность заключается в том, что фоновый процесс запрашивает стек уведомлений (или как-то просто измеряет его внутренне, как указано выше), когда количество наблюдателей привносит определенные системные функции в обход. Конечно, игнорируя тот факт, что это слишком много работы, вы будете разрабатывать подсистему, которая, вероятно, использует столько памяти и крадет столько, сколько бы вы ни старались с ней справиться!

TL; DR Есть так много других шаблонов и структур, которые вы могли бы использовать вместо уведомлений, так почему же вы тот, кто обслуживает потребности NSNotification?

+0

Это то, что я планирую только при запуске во время отладки, и меня больше беспокоит количество отправленных уведомлений, а не количество наблюдателей в моем случае. У меня есть только несколько наблюдателей. У меня есть класс, который следит за основным потоком, и если он не отвечает за настраиваемый период времени, он NSLogs «Основной поток не отвечает». Я думал об инструменте, подобном этому. Количество уведомлений довольно произвольно, но было бы неплохо узнать, отправляю ли я 20 уведомлений за цикл цикла, и я делаю изменения, и я внезапно отправляю 500 уведомлений за цикл цикла. –

+0

Тогда просто используйте этот класс. Кажется достаточно общим, чтобы иметь дело с блокировкой уведомлений. Или, если вы до этого, перепишите NSNotificationCenter. Это действительно не должно быть так сложно. – CodaFi

+0

И я отвечаю, что A) Вы сказали, что у вас есть инструмент, который может отслеживать блокировку потоков, и B), что такой инструмент будет слишком громоздким, чтобы быть полезным. Вам не нужно будет отслеживать основной поток, но вам нужно будет фильтровать только * методы * NSNotification, блокирующие цикл. По крайней мере, это слишком громоздко, как вы его изложили (инструменты отладки обычно отделены от самого приложения, поэтому они не мешают исполнению приложения и не сообщают ложные данные). Повторите или задайте вопрос об этом для «лучшего» ответа. – CodaFi