we doen veel asynchroon werk op mobiele apparaten in een poging om te voorkomen dat onze code de belangrijkste thread blokkeert. Voorheen betekende dat veel delegeren methoden, maar meer recente vooruitgang in Objective-C konden we waarden terug te keren naar blokken als voltooiing handlers. Ongetwijfeld zullen we dit ook in swift moeten doen.

hier is een functiedefinitie van Objective-C die gebruik maakt van het completion block patroon en de bijbehorende syntaxis om het te gebruiken:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

bedankt Fucking blok syntaxis! Ik kan me ook nooit herinneren dat dit materiaal

Swift enige kans krijgt om dit te verbeteren, omdat het geen bijzaak hoeft te zijn, het kan vanaf het allereerste begin worden ingebakken.

het resultaat kan complex lijken (zoals alle functies-in-functie-declaraties dat doen) maar is heel eenvoudig. Het is gewoon een functiedefinitie die een functie als argument neemt, dus zolang je het nesten begrijpt, moet dit snel duidelijk worden.:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

de voltooiing afsluiting hier is gewoon een functie die een string neemt en void retourneert. In eerste instantie klinkt dit achterstevoren-dit neemt een string als argument? We willen een touw terug! – maar we willen geen touw teruggeven, dat betekent dat we geblokkeerd zijn tot we terug zijn. In plaats daarvan noemen we een functie die de callee ons heeft gegeven en geven ze de bijbehorende argumenten.

het gebruik van afvulhandlers is echter gemakkelijker dan het declareren ervan, dankzij een slimme manier om functieoproepen van het swift-team te verkorten:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

Dit is een afsluiting, iets wat we kunnen gebruiken als het laatste argument een afsluiting is. Met behulp van de enigszins vreemde {() in } syntaxis, hebben we op magische wijze de resultaten dat we de sluiting terug in onze async functie. Ik heb echt nog niet plumb de diepten van swift om te begrijpen wat maakt deze syntaxis teek, maar voor nu ben ik blij dat het werkt.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.