Ответ
Одновременно (параллельно) может выполняться количество потоков, равное количеству физических ядер процессора устройства. На современных iPhone это обычно от 2 до 8 ядер.
Важные уточнения:
- Главный поток (Main Thread) только один и зарезервирован для обновления UI.
- Системные фреймворки (GCD,
OperationQueue) управляют параллелизмом, создавая оптимальное количество потоков в своих пулах. - Можно создать больше потоков, чем ядер, но они не будут выполняться параллельно — система будет переключать контекст между ними, что создает накладные расходы.
Пример создания фонового потока с помощью GCD:
// Задача выполняется на фоновом потоке из глобальной очереди
DispatchQueue.global(qos: .userInitiated).async {
// Выполнение тяжелой операции (парсинг, вычисления)
// Возврат результата на главный поток для обновления UI
DispatchQueue.main.async {
self.updateUI(with: result)
}
}
Рекомендация: Не создавайте потоки вручную (Thread). Используйте высокоуровневые API — Grand Central Dispatch (GCD) или OperationQueue, которые эффективно используют доступные ядра.
Ответ 18+ 🔞
Так, слушай, вот смотри, народ часто думает, что можно накрутить потоков, как на ёлку гирлянд, и всё полетит. Хуй там плавал!
Представь себе процессор — это как бригада грузчиков на складе. Физических ядер — это сколько реальных мужиков у тебя есть. На айфонах их обычно от двух до восьми. Вот ровно столько задач они могут параллельно в жопу впендюрить, каждый своим ядром. Не больше.
А теперь важные детали, чтобы не обосраться:
- Главный поток (Main Thread) — он один, как царь и бог. Только он имеет право тыкать пальцами в интерфейс. Если на него повесить какую-то тяжёлую хуйню, то весь твой интерфейс встанет колом, будто его ебнули кирпичом по лбу. Пользователь будет тыкать в экран, а в ответ — тишина и пиздец.
- Системные штуки вроде GCD или
OperationQueue— они умные, они сами создают пулы потоков и решают, кому когда работать. Твоё дело — дать задачу, а они уже разберутся. - Технически, потоков можно наделать овердохуища. Но это как нанять тысячу грузчиков, а дать им один погрузчик. Они будут толкаться, переругиваться, и вместо работы — один сплошной перекур и накладные расходы на переключение контекста. Бесполезная суета, короче.
Вот как это делают нормальные люди, через GCD:
// Кидаем тяжёлую работу в фоновую очередь (не на главную!)
DispatchQueue.global(qos: .userInitiated).async {
// Всё, мы в фоне. Здесь можно ебашить: парсить JSON, качать фото, считать до миллиарда.
// Главный поток в это время свободен и рисует анимации.
// Как только насрали результат, ВОЗВРАЩАЕМСЯ НА ГЛАВНЫЙ, БЛЯДЬ!
DispatchQueue.main.async {
self.updateUI(with: result) // И только здесь обновляем кнопки-картинки.
}
}
И главная рекомендация, чтоб тебя не выебали на code review: Не выёбывайся с ручным созданием Thread. Это прошлый век и путь в ад. Используй высокоуровневые штуки — Grand Central Dispatch (GCD) или OperationQueue. Они уже всё придумали за тебя и используют ядра по уму. Не изобретай велосипед, а то получишь велосипед с квадратными колёсами.