Разница между performSelectorInBackground и подклассом NSOperation

Я создал одно тестовое приложение для запуска цикла глубокого счетчика. Я запускаю функцию цикла в фоновом потоке, используя performSelectorInBackground, а также подкласс NSOperation отдельно.

Я также использую performSelectorOnMainThread для уведомления основного потока в методе backgroundthread и [NSNotificationCenter defaultCenter] postNotificationName в подклассе NSOperation для уведомления основного потока об обновлении пользовательского интерфейса.

Первоначально обе реализации дали мне тот же результат, и я могу обновить пользовательский интерфейс без каких-либо проблем. Единственное различие, которое я обнаружил, - это количество потоков между двумя реализациями.

Реализация performSelectorInBackground создала один поток и завершила его после завершения цикла, и счетчик потоков моего приложения снова стал равным 1.

Реализация подкласса NSOperation создала два новых потока и сохраняет в приложении, и я могу видеть 3 потока после завершения цикла в функции main ().

Итак, мой вопрос: почему NSOperation создает два потока и почему он не завершился так же, как реализация первого фонового потока?

Я немного запутался и не могу решить, какая реализация лучше всего с точки зрения производительности и управления памятью.


person AmitSri    schedule 29.05.2010    source источник
comment
Кажется, что NSOperationQueue сохраняет потоки и не освобождает их. Есть мысли по этому поводу?   -  person AmitSri    schedule 29.05.2010


Ответы (1)


Скорее всего, очередь операций поддерживает потоки, ожидая появления новых операций.

Вы должны помнить, что очередь операций предназначена для эффективной работы со многими операциями, поэтому создание и уничтожение потоков для каждой операции может снизить производительность. Итак, то, что вы видите, вероятно, просто устроена таким образом, чтобы очередь работала, поддерживая в рабочем состоянии пул потоков.

По сути, если вы правильно используете очередь операций и в соответствии с документацией, я бы не стал об этом беспокоиться.

person Mike Weller    schedule 29.05.2010
comment
Спасибо, это означает, что я могу повторно использовать одну и ту же очередь операций для нескольких попыток одной и той же операции / цикла или есть ли способ слить пул потоков, созданный очередью операций. - person AmitSri; 01.06.2010
comment
АмитСри: Вы можете поставить в очередь столько операций, сколько захотите. Вы можете выбросить очередь и создать новую позже, но для этого нет никаких причин для повышения производительности - потоки не используют процессорное время, если на них что-то не запущено, поэтому нет причин выбросить их. (Проверьте это в Activity Monitor, если вы мне не верите. И если вы видите, что ваше приложение использует процессорное время, профилируйте в Instruments или Shark, чтобы узнать, на что оно использует это время.) - person Peter Hosey; 01.06.2010
comment
@Mike Weller, значит, поток внутри очереди будет уничтожен в конце. Я верно? - person Vijay-Apple-Dev.blogspot.com; 30.07.2011