My notes on an async iterator class.
- This iterator class can be used for iterating simple arrays
- Handle async local / remote services.
Here is an example where the iterator is used to iterate a simulated remote service.
import Foundation
/**
* Demonstrates async iterator
*/
class DemoIterator: ArrayIterator<DemoItem> {
var complete: Completed
init(array: Array<T>, onComplete:@escaping Completed) {
self.complete = onComplete
super.init(array: array)
}
}
/**
* Extension
*/
extension DemoIterator {
typealias Completed = () -> Void
func iterate(callBack:@escaping (_ item: DemoItem, _ success: Bool) -> Void) {
Swift.print("iterate")
if hasNext() {
let item: DemoItem = next()
DispatchQueue.global(qos: .background).async {
sleep(2)/*Simulates some remote service taking 2.0 sec*/
let eitherOr: Bool = arc4random_uniform(2) == 0/*heads or tails*/
Swift.print("Doing some work 💪, success: \(eitherOr ? "✅" : "🚫")")
callBack(item, eitherOr)
}
} else {
complete()
}
}
}
struct DemoItem {}
/**
* ## Examples:
* DemoIteratorExample().iterate() // All done: 🎉 2
*/
class DemoIteratorExample {
var validItems: [DemoItem] = []
lazy var arrIterator: DemoIterator = DemoIterator(array: [DemoItem() ,DemoItem(), DemoItem()]) {
print("All done: 🎉 \(self.validItems.count)")// the result varies between a count of 0 and 3
}
func iterate() {
arrIterator.iterate { item, success in
if success {
self.validItems.append(item)
self.iterate()
} else {
self.iterate()
}
}
}
}
Supporting files:
After the jump, hit the keyboard char T
and search for Iteratable.swift
https://github.com/eonist/swift-utils (this is now located in the array repo)