В чем разница между "потоком" и "очередью" в разработке iOS? [дубликат]
этот вопрос уже есть ответ здесь:
Я новичок в iOS-разработке. Теперь я совершенно запутался в двух понятиях:" поток "и"очередь". Все, что я знаю, это то, что они оба о многопоточном программировании. Может кто-нибудь интерпретировать эти два понятия и разницу между ними для меня? Заранее спасибо!
2 ответов
прежде чем вы прочтете мой ответ, возможно, захотите прочитать это -миграция из потоков
Я держу обсуждение теоретическим, так как ваш вопрос не имеет образцов кода. Обе эти конструкции необходимы для повышения отзывчивости и удобства использования приложений.
очередь сообщений - это структура данных для хранения сообщений с момента их отправки до момента, когда получатель получает и действует на них. Обычно очереди используются как способ "подключения" производителей (данных) и потребителей (данных).
какой-нить бассейн - это пул потоков, которые делают какую-то обработку. Пул потоков обычно имеет некоторую потокобезопасную очередь (см. очередь сообщений), прикрепленную, чтобы вы могли выполнять задания в очереди. Здесь очередь обычно называется "очередь задач".
таким образом, пул потоков может существовать на стороне производителя (создание данных) или на стороне потребителя (обработка данные.) И способ "передать" эти данные будет через очереди. Зачем нужен этот "посредник" -
- он разъединяет системы. Производители не знают о потребителях и наоборот.
- потребители не бомбардируются данными, если есть всплеск данных производителя. Длина очереди увеличится, но потребители будут в безопасности.
пример:
в iOS основной поток, также называемый потоком пользовательского интерфейса, очень важно, потому что он отвечает за отправку событий в соответствующий виджет, и это включает в себя события рисования, в основном пользовательский интерфейс, который пользователь видит и взаимодействует.
Если вы нажмете кнопку на экране, поток пользовательского интерфейса отправляет событие касания в приложение, которое, в свою очередь, устанавливает его нажатое состояние и отправляет запрос на событие очереди. Поток пользовательского интерфейса выводит запрос и уведомляет виджет о перерисовке.
Как работает NSOperationQueue и NSThread:
NSThread:
- разработчики iOS должны написать код для работы / процесса, который он хочет выполнить вместе с созданием и управлением самими потоками.
- разработчики iOS должны быть осторожны с планом действий по использованию потоков.
- разработчик iOS должен управлять позитивными проблемами, такими как повторное использование потока, блокировки и т. д. ими самими.
- поток будет потреблять и больше памяти.
NSOperationQueue:
- класс NSOperation является абстрактным классом, который инкапсулирует код и данные, связанные с одной задачей.
- разработчик должен использовать подкласс или один из системных подклассов NSOperation для выполнения задачи.
- добавьте операции в NSOperationQueue для их выполнения.
- NSOperationQueue создает новый поток для каждой операции и запускает их в порядке они добавляются.
- очереди операций обрабатывают все управление потоками, гарантируя, что операции выполняются как можно быстрее и эффективнее.
- очередь операций выполняет операции либо непосредственно, запустив их во вторичных потоках, либо косвенно с помощью GCD (Grand Central Dispatch).
- Он заботится обо всем управлении памятью и значительно упрощает процесс.
- если вы не хотите использовать очередь операций, вы можете также выполните операцию, вызвав ее метод start. Это может сделать ваш код слишком сложен.
Как Использовать NSThread И NSOperationQueue:
NSThread:
- хотя очереди операций-предпочтительный способ одновременного выполнения задач, в зависимости от приложения все еще могут быть времена, когда вам нужно создать пользовательские потоки.
- Threads по-прежнему являются хорошим способом реализации кода, который должен выполняться в режиме реального времени.
- использовать нити для конкретные задачи, которые не могут быть реализованы никаким другим способом.
- Если вам нужно более предсказуемое поведение из кода, работающего в фоновом режиме, потоки все равно могут предложить лучшую альтернативу.
NSOperationQueue:
- используйте NSOperationQueue, когда у вас есть более сложные операции, которые вы хотите запускать одновременно.
- NSOperation позволяет для подклассов, зависимостей, приоритетов, отмены и поддерживает ряд других более высокого уровня особенности.
- NSOperation фактически использует GCD под клобуком поэтому оно как multi-core, multi-поток способный как GCD.
теперь вы должны знать о преимуществах и недостатках NSTread и NSOperation. Вы можете использовать любой из них в соответствии с потребностями вашего приложения.