SwiftではUIの更新はMain threadで実行しなければならないというルールがあります。
そのため非同期的にMain threadで処理する場合は DispatchQueue.main.async
を使用しますが、非同期処理をする必要のない箇所で無闇に使用してしまうと処理フローの制御がしづらくなるなどの問題が起きてしまうため、サブスレッドのタスク内でのUIの更新などに限定する必要があります。
メインスレッドで実行されているかどうか確認する方法
print(Thread.current.isMainThread)
スレッドへの理解が浅いままasyncを使用していてUI更新が重くなり挙動がおかしくなっていたので、上記で確認しつつ不要な場合は同期処理で行うように修正しました。