В чем разница между "потоком" и "очередью" в разработке iOS? [дубликат]

этот вопрос уже есть ответ здесь:

Я новичок в iOS-разработке. Теперь я совершенно запутался в двух понятиях:" поток "и"очередь". Все, что я знаю, это то, что они оба о многопоточном программировании. Может кто-нибудь интерпретировать эти два понятия и разницу между ними для меня? Заранее спасибо!

2 ответов


прежде чем вы прочтете мой ответ, возможно, захотите прочитать это -миграция из потоков

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

очередь сообщений - это структура данных для хранения сообщений с момента их отправки до момента, когда получатель получает и действует на них. Обычно очереди используются как способ "подключения" производителей (данных) и потребителей (данных).

какой-нить бассейн - это пул потоков, которые делают какую-то обработку. Пул потоков обычно имеет некоторую потокобезопасную очередь (см. очередь сообщений), прикрепленную, чтобы вы могли выполнять задания в очереди. Здесь очередь обычно называется "очередь задач".

таким образом, пул потоков может существовать на стороне производителя (создание данных) или на стороне потребителя (обработка данные.) И способ "передать" эти данные будет через очереди. Зачем нужен этот "посредник" -

  1. он разъединяет системы. Производители не знают о потребителях и наоборот.
  2. потребители не бомбардируются данными, если есть всплеск данных производителя. Длина очереди увеличится, но потребители будут в безопасности.

пример:

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

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


Как работает NSOperationQueue и NSThread:

NSThread:

  1. разработчики iOS должны написать код для работы / процесса, который он хочет выполнить вместе с созданием и управлением самими потоками.
  2. разработчики iOS должны быть осторожны с планом действий по использованию потоков.
  3. разработчик iOS должен управлять позитивными проблемами, такими как повторное использование потока, блокировки и т. д. ими самими.
  4. поток будет потреблять и больше памяти.

NSOperationQueue:

  1. класс NSOperation является абстрактным классом, который инкапсулирует код и данные, связанные с одной задачей.
  2. разработчик должен использовать подкласс или один из системных подклассов NSOperation для выполнения задачи.
  3. добавьте операции в NSOperationQueue для их выполнения.
  4. NSOperationQueue создает новый поток для каждой операции и запускает их в порядке они добавляются.
  5. очереди операций обрабатывают все управление потоками, гарантируя, что операции выполняются как можно быстрее и эффективнее.
  6. очередь операций выполняет операции либо непосредственно, запустив их во вторичных потоках, либо косвенно с помощью GCD (Grand Central Dispatch).
  7. Он заботится обо всем управлении памятью и значительно упрощает процесс.
  8. если вы не хотите использовать очередь операций, вы можете также выполните операцию, вызвав ее метод start. Это может сделать ваш код слишком сложен.

Как Использовать NSThread И NSOperationQueue:

NSThread:

  1. хотя очереди операций-предпочтительный способ одновременного выполнения задач, в зависимости от приложения все еще могут быть времена, когда вам нужно создать пользовательские потоки.
  2. Threads по-прежнему являются хорошим способом реализации кода, который должен выполняться в режиме реального времени.
  3. использовать нити для конкретные задачи, которые не могут быть реализованы никаким другим способом.
  4. Если вам нужно более предсказуемое поведение из кода, работающего в фоновом режиме, потоки все равно могут предложить лучшую альтернативу.

NSOperationQueue:

  1. используйте NSOperationQueue, когда у вас есть более сложные операции, которые вы хотите запускать одновременно.
  2. NSOperation позволяет для подклассов, зависимостей, приоритетов, отмены и поддерживает ряд других более высокого уровня особенности.
  3. NSOperation фактически использует GCD под клобуком поэтому оно как multi-core, multi-поток способный как GCD.

теперь вы должны знать о преимуществах и недостатках NSTread и NSOperation. Вы можете использовать любой из них в соответствии с потребностями вашего приложения.