---
title: Многопоточное программирование
seo:
  title: Многопоточное программирование — IOS Developer
  description: Тема «Многопоточное программирование» для собеседования IOS Developer. Какие инструменты нам предлагает iOS для работы с многопоточностью? Что такое очередь?
---

[Все темы IOS Developer](/ios-developer)

## <strong>Какие инструменты нам предлагает iOS для работы с многопоточностью?</strong> [#q-14bee738d69b81549ccfcacf843ab050]

iOS предлагает несколько инструментов для работы с многопоточностью, включая&#58;

1. Grand Central Dispatch <code>&#40;GCD&#41;</code>&#58; Мощный и простой в использовании API для асинхронного выполнения задач на множестве потоков. Он предоставляет очереди задач и пулы потоков для управления конкурентным выполнением.

1. Операции <code>&#40;Operations&#41;</code>&#58; Высокоуровневый API для организации асинхронной работы с задачами. Он строится поверх GCD и обеспечивает более высокий уровень абстракции, позволяя легко управлять зависимостями между задачами.

1. Потоки <code>&#40;Threads&#41;</code>&#58; Непосредственное управление потоками выполнения, хотя это менее распространенный и рекомендуемый способ работы с многопоточностью на платформе iOS из-за сложностей синхронизации и управления памятью.

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## <strong>Что такое очередь?</strong> [#q-14bee738d69b8154b67cf512db6efe3c]

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

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## <strong>Какие есть виды очередей?</strong> [#q-14bee738d69b8113bcbeff8e6d823656]

Существует несколько видов очередей&#58;

1. <strong>Очереди с фиксированным размером</strong>&#58; Ограничены по размеру
   и отбрасывают новые элементы, когда очередь достигает максимальной емкости.

1. <strong>Очереди с приоритетом</strong>&#58; Элементы имеют определенный
   приоритет, и элемент с более высоким приоритетом обрабатывается раньше.

1. <strong>Круговые очереди</strong> <code>&#40;Ring Buffer&#41;</code>&#58;
   Очередь, в которой после достижения конца массива элементы начинают
   добавляться с начала массива, создавая циклическую структуру данных.

1. <strong>Блокирующие и неблокирующие очереди</strong>&#58; Блокирующие очереди
   блокируют поток, пока не будет доступно место для добавления или извлечения
   элементов, в то время как неблокирующие очереди возвращают ошибку или null,
   если операция не может быть выполнена немедленно.

1. <strong>Одно- и многоуровневые очереди</strong>&#58; Одноуровневые очереди
   имеют только один уровень приоритета, в то время как многоуровневые могут
   иметь несколько уровней приоритета для различных видов задач.

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## <strong>Какие приоритеты бывают у очередей?</strong> [#q-14bee738d69b8157b407e51c9dde79ad]

В GCD используют классы QoS&#58; userInteractive для срочной работы интерфейса, userInitiated для результата, которого ждёт пользователь, utility для длительной работы и background для несрочных задач. Также есть default и unspecified. QoS влияет на планирование ресурсов, но не задаёт строгий глобальный порядок выполнения задач.

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## Как запустить задачу после завершения двух других? [#q-14bee738d69b81719c46f52e1e421f6c]

Используйте DispatchGroup. До запуска каждой из двух операций вызовите enter(), а по её фактическому завершению вызовите leave(). В notify(queue&#58;) разместите третью задачу. Для каждой enter() должен быть ровно один leave(), включая ветви ошибок. Альтернатива с OperationQueue&#58; добавить обе операции как зависимости третьей.

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## <strong>Какие могут быть проблемы при работе с многопоточностью?</strong> [#q-14bee738d69b8111bd0ff85d248ddedd]

Основные проблемы&#58; гонки данных при несинхронизированной записи, взаимоблокировки, активные блокировки, голодание задач и блокирование главного потока. Для UI также важно соблюдать изоляцию главного потока. Очередь или async-вызов сами по себе не делают общие данные потокобезопасными.

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## <strong>Какие вы знаете способы реализации многопоточности в Swift?</strong> [#q-14bee738d69b81b5af6cf733e2e5c8a7]

Способы реализации многопоточности в Swift включают&#58;

- <code>Grand Central Dispatch</code> <strong>(GCD)</strong>&#58; Простая и
  мощная система для выполнения задач на различных очередях.

- <code>Operation и OperationQueue</code>&#58; Более высокоуровневая абстракция
  над GCD, предоставляющая дополнительные возможности управления задачами и их
  зависимостями.

- <code>Thread</code>&#58; Низкоуровневый способ управления потоками, который
  редко используется напрямую.

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::

---

## <strong>Как использовать</strong> <code>GCD</code> <strong>(Grand Central Dispatch) для выполнения задач асинхронно?</strong> [#q-14bee738d69b815d92f9cc9a9c1941ed]

<code>GCD</code> используется для выполнения задач асинхронно путем размещения
их в очереди. Например, для выполнения задачи в фоновом потоке и обновления
<code>UI</code> в основном потоке&#58;

```swift
DispatchQueue.global().async {
    // Выполнение фоновой задачи
    let result = performHeavyTask()

    DispatchQueue.main.async {
        // Обновление UI с результатом
        updateUI(with: result)
    }
}
```

:::note[Ссылки для изучения]

1. [Многопоточность в iOS разработке](https://habr.com/ru/articles/742502/)
   :::
