The first characteristic of asynchronous code is that it returns immediately and notifies the caller when it has completed the operation. The best solution is to return the result of the computation as well. This way we get more function style Input -> Output functions style.
Let's have a look at this simple example. This code has many issues and will refactor them all.
class SalesData { var revenue: [Int] var average: Int? init (revenue: [Int]) { self.revenue = revenue } func calculateAverage() { let queue = GCD.backgroundQueue() dispatch_async(queue) { var sum = 0 for index in self.revenue.indices { sum += self.revenue[index] } self.average = sum / self.revenue.count } } }