Надо сказать, что многопоточность (сoncurrency) в iOS всегда входит в вопросы, задаваемые на интервью разработчикам iOS приложений, а также в число топ ошибок, которые делают программисты при разработке iOS приложений. Поэтому так важно владеть этим инструментом в совершенстве.
Итак, у вас есть приложение, оно работает на main thread (главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI). Как только вы начинаете добавлять к вашему приложению такие затратные куски кода, как загрузка данных из сети или обработка изображений на main thread (главном потоке), то работа вашего пользовательского интерфейса начнет сильно замедляться и даже может привести к полному его «замораживанию».
Как вы можете изменить архитектуру вашего приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит сoncurrency или многопоточность , которая позволяет одновременно выполнять две или более независимые задачи (tasks): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.
Процессор в каждый заданный момент времени может выполнять один из ваших потоков (threads).
В случае одноядерного процессора, сoncurrency или многопоточность достигается многократными кратковременными переключениями между «потоками» (threads), на которых выполняются задачи (tasks), создавая достоверное представление об одновременном выполнении задач на одноядерном процессоре. На многоядерном процессоре многопоточность достигается тем, что каждому «потоку», связанному с задачей, предоставляется свое собственное ядро для запуска. Обе эти технологии используют общее понятие многопоточности (сoncurrency).
Своеобразной платой за введение многопоточности в вашем приложениии является трудность обеспечения безопасного выполнения кода на различных потоках (thread safety). Как только мы позволяем заданиям (tasks) работать параллельно, появляются проблемы, связанные с тем, что разные задания (tasks) захотят получить доступ к одним и тем же ресурсам, например, захотят изменять одну и ту же переменную в разных потоках, или захотят получить доступ к ресурсам, которые уже заблокированы другими заданиями. Это может привести к разрушению самих ресурсов, используемых операциями на других потоках.
В iOS программировании многопоточность предоставляется разработчикам в виде нескольких инструментов: Thread, Grand Central Dispatch (сокращенно GCD) и Operation — и используется с целью увеличения производительности и отзывчивости пользовательского интерфейса. Мы не будем рассматривать Thread, так как это низкоуровневый механизм, а сосредоточимся на GCD и Operation (объектно-ориентированном API, построенном поверх GCD).