Demonstrating how to control both heavy operations and UI interactive actions with a predictable output
swiftDispatchBarriers
Demonstrating how to control both heavy operations and UI interactive actions with a predictable output.
English
Russian
Этот проект показывает, как можно использовать concurrent custom dispatch queues для решения продуктовой задачи. Когда одновременно выполняются тяжелые операции, при этом UI остается интерактивным.
Контекст приложения
- Написать приложение, которое выводит на экран 10 квадратов белого цвета.
- Далее после запуска, не блокируя UI, цвета меняются на случайные*. 2а. * Изменение цветов – heavy operation, которое может занимать несколько секунд (зафейкать это поведение).
- Так же в UI присутствует кнопка, позволяющая изменить цвет любого квадрата на случайный. Это может быть как heavy операцией, так и нет.
- UI никогда не должен “зависать” – кнопка должна нажиматься.
Постановка задачи
Необходимо средствами многопоточности сделать так, чтобы нажатие на кнопку не меняло цвета квадратов, пока они все не станут “не белыми”, то есть пока алгоритм изменения цветов (2) не отработает.
Solution
UI stays interactive. Pressing the button doesn’t change the colors until the algo finishes. DispatchBarrier makes it possible (the code in master
branch):
Simulator.Screen.Recording.-.iPhone.8.-.2022-10-13.at.17.57.58.mp4
The same code, but without using DispatchBarrier on the working concurrent custom queue (uncomment Line 44 in ContentView.swift file, and comment Line 43):
Simulator.Screen.Recording.-.iPhone.8.-.2022-10-13.at.17.58.49.mp4