Nová verzia Swift ponúka zaujímavú funkciu na správu asynchronného kódu. Každý, kto už skúšal vývoj metódou asynchronného programovania sa určite stretol s tzv Closures. Medzi hlavné nevýhody spomínaných Closures sú hlavne manažment pamäte, najmä ak je definovaná closure vo vnútri funkcie a nízky výkon. Syntax je pomerne jednoduchá, ale pri komplexnejšiej logike môže byť dosť tricky.
func countToTen(completion: @escaping ((String) -> Void)) { var currentSecond = 0 Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in currentSecond += 1 if currentSecond == 10 { completion("Counting completed") } } } countToTen { message in print(message) }
Nasledujúci kód je ukážkou využitia spomínaných Closures. Máme funkciu, ktorá zavolá completion po 10 sekundách.

Poďme nasledujúci príklad trošku skomplikovať. Povedzme, po dvoch sekundách chcem odoslať správu, po odoslaní správy chcem počkať dve sekundi a odoslať ďalšiu správu, po odoslaní ďalšej správy chcem čakať päť sekúnd a odoslať poslednú správu. Ako to spravím?
func wait(seconds: TimeInterval, message: String, completion: @escaping ((String) -> Void)) { var currentSecond = 0 Timer.scheduledTimer(withTimeInterval: seconds, repeats: true) { _ in currentSecond += 1 if TimeInterval(currentSecond) == seconds { completion(message) } } } wait(seconds: 2, message: "First message") { message in print("Sending: " + message) wait(seconds: 2, message: "Second message") { message in print("Sending: " + message) wait(seconds: 5, message: "Final message") { message in print("Sending: " + message) } } }
Na spracovanie jednotlivých správ a časových úsekov je potrebné sa vnárať hlbšie. Po novom existuje elegantejšia cesta ako dosiahnúť podobný výsledok. Swift 5.5 predstavuje paradigmu pre asynchronné programovanie async-await.
Hlavným motívom async-await prístupu je písanie komplexnejšieho asynchronného kódu tak ako by bol synchronný, čo znamená že je zachované čítanie riadok po riadku a nevznikajú kódové „stromy“.
Predchádzajúci príklad po úpravy na paradigma async-await by vyzeral nasledovne:
func wait(seconds: TimeInterval, message: String) async -> String { Thread.sleep(forTimeInterval: seconds) return message } async { let message1 = await wait(seconds: 2, message: "First Message") print(message1) let message2 = await wait(seconds: 2, message: "Second Message") print(message2) let message3 = await wait(seconds: 2, message: "Final Message") print(message3)
Tu môžete vidieť, že slovíčko async indikuje, že daná funkcia bude asynchronna. Okrem toho, nieje potrebný žiadny completion block a namiesto neho sa vracia String ako dátovy typ. Pri použitý stačí pre funkciu napísať await a a program bude pokračovať až v prípade, že sa vráti hodnota z funkcie wait(…).
Asynchronné programovanie je moderné a často využívané a vďaka Async-await oveľa lepšie čitateľné.