Ich war nur neugierig, wie ich das angehen würde. Wenn ich eine Funktion hätte und wollte, dass etwas passiert, wenn sie vollständig ausgeführt wurde, wie würde ich dies der Funktion hinzufügen? Vielen Dank
Ich war nur neugierig, wie ich das angehen würde. Wenn ich eine Funktion hätte und wollte, dass etwas passiert, wenn sie vollständig ausgeführt wurde, wie würde ich dies der Funktion hinzufügen? Vielen Dank
Antworten:
Angenommen, Sie haben eine Download-Funktion zum Herunterladen einer Datei aus dem Netzwerk und möchten benachrichtigt werden, wenn die Download-Aufgabe abgeschlossen ist.
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
}
})
Ich hoffe es hilft.
Ich hatte Probleme, die Antworten zu verstehen, daher gehe ich davon aus, dass jeder andere Anfänger wie ich das gleiche Problem haben könnte wie ich.
Meine Lösung entspricht der Top-Antwort, ist aber hoffentlich etwas klarer und verständlicher für Anfänger oder Leute, die nur Probleme mit dem Verständnis im Allgemeinen haben.
So erstellen Sie eine Funktion mit einem Completion-Handler
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
um die Funktion zu nutzen
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
Ihre Ausgabe wird sein
Etwas machen
Tada !!!
Hoffe das hilft!
Einfaches Swift 4.0-Beispiel:
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)
}
Wie man es benutzt:
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")
}
})
Zu diesem Zweck können wir Verschlüsse verwenden. Versuche Folgendes
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
Irgendwann können wir diese Funktion wie unten angegeben aufrufen.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
Weitere Informationen zu Verschlüssen finden Sie unter folgendem Link .
Swift 5.0 +, einfach und kurz
Beispiel:
Stil 1
func methodName(completionBlock: () -> Void) {
print("block_Completion")
completionBlock()
}
Stil 2
func methodName(completionBlock: () -> ()) {
print("block_Completion")
completionBlock()
}
Verwenden:
override func viewDidLoad() {
super.viewDidLoad()
methodName {
print("Doing something after Block_Completion!!")
}
}
Ausgabe
block_Completion
Nach Block_Completion etwas tun !!
Ich bin ein wenig verwirrt über maßgeschneiderte Fertigstellungshandler. In Ihrem Beispiel:
Angenommen, Sie haben eine Download-Funktion zum Herunterladen einer Datei aus dem Netzwerk und möchten benachrichtigt werden, wenn die Download-Aufgabe abgeschlossen ist.
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)
}
Ihre // download code
wird weiterhin asynchron ausgeführt. Warum geht der Code nicht direkt zu Ihnen let flag = true
und completion Handler(success: flag)
ohne darauf zu warten, dass Ihr Download-Code fertig ist?