Vorbeam acum ceva timp despre closure într-un context mai didactic. De curând am avut nevoie pentru a oferi o explicație despre closure într-un context ceva mai amplu.
Cadrul în care se desfășoară activitatea noastră este următorul:
Sunt într-un ViewController – VC1 – și apăsând pe un Button (pasul 1) ajungem într-un al doilea ViewControoler – VC2. În acest al doilea VC trebuie sa completăm câteva detalii să zicem – nume și email și să le aruncăm peste rețea (pasul 2). Serverul procesează ceea ce i-am trimis noi și ne răspunde (pasul 3) cu un mesaj de “succes“.
În momentul în primim mesajul de “succes” deschidem un UIAlertController (pasul 4) care imi arată mesajul primit. La apăsarea butonului de OK (pasul 5) trebuie sa eliberăm VC2 și să ne întoarcem în VC1.
Ce problemă avem la pasul 5? Operațiunea de eliberare a VC2 trebuie făcută în momentul în care se face click pe OK, nu în momentul în care se afisează UIAlertController-ul.
Funcția care face afișarea UIAlertController-ului este definită într-un Alertmanager astfel:
static func showGenericDialog(_ message: String, viewController: UIViewController, completionHandler: @escaping () -> Void ) { let alert = UIAlertController(title: "TITLE", message: message, preferredStyle: UIAlertControllerStyle.alert) let okAction: UIAlertAction = UIAlertAction(title: "Ok", style: .default, handler: { (action: UIAlertAction) in completionHandler() }) alert.addAction(okAction) OperationQueue.main.addOperation { viewController.present(alert, animated: true, completion: nil) } }
Ce se observă? Am definit în okAction un UIAlertAction cu un handler care se va “activa” atunci când se apasă pe okAction. Acțiunea din handler, funcția anonimă prezentă acolo va fi implementată în momentul în care această funcție este apelată.
Prin urmare, avem un minunat closure în momentul în care vom apela funcția showGenericDialog:
AlertManager.showGenericDialog(message, viewController: self!,completionHandler: { self?.dismiss(animated: true, completion: nil) })
Avem prin urmare cu ajutorul funcției anonime trecerea de la VC2 la VC1 atunci când utilizatorul face click pe butonul de OK.