Hier ist eine allgemeine Lösung, die jeder Asynchron-Funktion angewendet werden kann, die keine Parameter hat, die Rückrufe ausgenommen. Ich vereinfachte die Logik, indem ich nur success
und failure
Rückrufe, eine progress
sollte nicht so schwer hinzuzufügen.
Also, vorausgesetzt, dass Ihre Funktion ist wie folgt:
func startUploading(success: Void -> Void, failure: NSError -> Void) {
DDLogDebug("JogUploader: Creating jog: \(self.jog)")
API.sharedInstance.createJog(self.jog,
failure: { error in
failure(error)
}, success: {_ in
success()
})
}
A retry
Funktion passende es würde wie folgt aussehen:
func retry(numberOfTimes: Int, task: (success: Void -> Void, failure: NSError -> Void) -> Void, success: Void -> Void, failure: NSError -> Void) {
task(success: success,
failure: { error in
// do we have retries left? if yes, call retry again
// if not, report error
if numberOfTimes > 1 {
retry(numberOfTimes - 1, task: task, success: success, failure: failure)
} else {
failure(error)
}
})
}
und kann wie folgt aufgerufen werden:
retry(3, task: startUploading,
success: {
print("Succeeded")
},
failure: { err in
print("Failed: \(err)")
})
Das oben genannte wird den Anruf startUploading
dreimal wiederholen, wenn es scheitert immer wieder, sonst wird beim ersten Erfolg gestoppt.
Bearbeiten. Funktionen, die andere params tun haben können einfach in einem Verschluss eingebettet werden:
func updateUsername(username: String, success: Void -> Void, failure: NSError -> Void) {
...
}
retry(3, { success, failure in updateUsername(newUsername, success, failure) },
success: {
print("Updated username")
},
failure: {
print("Failed with error: \($0)")
}
)
Check out meine Antwort für eine ähnliche Frage: http://StackOverflow.com/a/38720898/319805 – MNassar