Разница между executeSelectorInBackground и подклассом NSOperation - PullRequest
4 голосов
/ 29 мая 2010

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

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

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

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

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

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

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

1 Ответ

6 голосов
/ 29 мая 2010

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

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

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

...