Ero solo curioso di come avrei affrontato questo. Se avessi una funzione, e volevo che succedesse qualcosa quando era completamente eseguita, come dovrei aggiungerla alla funzione? GrazieCome posso creare una funzione con un gestore di completamento in Swift?
risposta
Supponiamo che tu disponga di una funzione di download per scaricare un file dalla rete e desideri ricevere una notifica al termine dell'attività di download.
typealias CompletionHandler = (success:Bool) -> Void
func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {
// download code.
let flag = true // true if download succeed,false otherwise
completionHandler(success: flag)
}
// How to use it.
downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
})
Spero che sia d'aiuto. : -]
Questo grande lavoro, ma più per curiosità, ho mi stavo chiedendo se in qualche modo potresti scrivere un gestore di completamento nella tua funzione. – traw1233
Ciao Floks, Voglio chiamare questo CompletionHandler da un'altra funzione, quindi come ottenere questo ?? –
Sono un po 'confuso su gestori di completamento personalizzati. Nel tuo esempio:
Supponiamo che tu disponga di una funzione di download per scaricare un file dalla rete e desideri ricevere una notifica al termine dell'attività di download.
typealias CompletionHandler = (success:Bool) -> Void
func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {
// download code.
let flag = true // true if download succeed,false otherwise
completionHandler(success: flag)
}
tuo // download code
sarà ancora correva in modo asincrono. Perché il codice non dovrebbe passare direttamente al tuo let flag = true
e completion Handler(success: flag)
senza attendere il completamento del tuo codice di download?
Alla fine, qualcosa deve sedersi e aspettare che il codice venga eseguito, non è una torre gigante di elefanti asincroni fino in fondo. "Ran asincronicamente" significa che ci sono due thread. Uno di loro si siede e aspetta che il compito sia svolto, l'altro continua e non lo fa. Il gestore di completamento viene chiamato, o almeno programmato per essere chiamato, alla fine del thread che esegue il lavoro. –
Possiamo utilizzare Chiusure per questo scopo. Prova il seguente
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)->()) {
//some code here
completionClosure(indexes: list)
}
Ad un certo punto possiamo chiamare questa funzione come indicato di seguito.
healthIndexManager.loadHealthCareList { (indexes) ->() in
print(indexes)
}
prega di fare riferimento al seguente link per ulteriori informazioni riguardanti Chiusure.
Oltre a quanto sopra: chiusura trascinamento può essere utilizzato.
downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
}
Ho avuto problemi a capire le risposte, quindi presumo che qualsiasi altro principiante come me possa avere lo stesso problema di me.
La mia soluzione è la stessa della risposta migliore, ma si spera un po 'più chiara e facile da capire per i principianti o le persone che hanno difficoltà a comprendere in generale.
Per creare una funzione con un gestore di completamento
func yourFunctionName(finished:() -> Void) {
print("Doing something!")
finished()
}
di utilizzare la funzione di
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
L'output sarà
Doing something
Tada!!!
Spero che questo aiuti!
Grazie per aver dedicato del tempo per fornire questa risposta. L'ho capito ed è stato in grado di implementarlo con successo. – Jazzmine
Simple Swift 4.0 Esempio:
func method(arg: Bool, completion: (Bool) ->()) {
print("First line of code executed")
// do stuff here to determine what you want to "send back".
// we are just sending the Boolean value that was sent in "back"
completion(arg)
}
come usarlo:
method(arg: true, completion: { (success) -> Void in
print("Second line of code executed")
if success { // this will be equal to whatever value is set in this method call
print("true")
} else {
print("false")
}
})
C'è un incredibile video su Youtube: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source= web & cd = 4 & ved = 0ahUKEwic45WLpN7MAhXJ1CYKHUzKDb8QtwIIMDAD & url = https% 3A% 2F% 2Fwww.youtube.com% 2Fwatch% 3Fv% 3DeoP6yYnlI9Y & USG = AFQjCNFjK7cX7BMh7AkeSrIkaAdAGvjatg & SIG2 = 0zbt0TJOzM0GcXYZ6Xv2OA & BVM = bv.122129774, d.eWE & CAD = rjt –