Designing asynchronous code
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 } } }
Note
We have made a GCD structure that provides a nice API for working with GCD code. In the preceding example we have used a GCD backgroundQueue
function; here is its implementation:
struct GCD { static func backgroundQueue...