There are many ways to program asynchronously. "GCD", "Operation queue" are commonly used. Also there is Combine and async/await that are newly introduced.
Combine is useful. You can think it as a notification, when a notice comes the receiver get notified and run some code.
However, combine has it limitation. It is a well-designed series operations followed by its rules. You have to carefully design the path. Also, it can't be finished with a throw. So you have to convert throw to
async/await is more flexible. You can do it as what you want. Especially if you want to chain functions with throws.