Ich baue eine Swift-basierte iOS-Anwendung, die PromiseKit verwendet, um Versprechungen zu behandeln (obwohl ich offen bin, die Versprechens-Bibliothek zu wechseln, wenn es mein Problem leichter zu lösen macht). Es gibt einen Codeabschnitt, der entwickelt wurde, um Fragen zum Überschreiben von Dateien zu behandeln.Wie kann ich Versprechen in Swift innerhalb einer Schleife verketten?
Ich habe Code, der in etwa wie folgt aussieht:
let fileList = [list, of, files, could, be, any, length, ...]
for file in fileList {
if(fileAlreadyExists) {
let overwrite = Promise<Bool> { fulfill, reject in
let alert = UIAlertController(message: "Overwrite the file?")
alert.addAction(UIAlertAction(title: "Yes", handler: { action in
fulfill(true)
}
alert.addAction(UIAlertAction(title: "No", handler: { action in
fulfill(false)
}
} else {
fulfill(true)
}
}
overwrite.then { result -> Promise<Void> in
Promise<Void> { fulfill, reject in
if(result) {
// Overwrite the file
} else {
// Don't overwrite the file
}
}
}
Dies ist jedoch nicht die gewünschte Wirkung; Die for-Schleife wird so schnell ausgeführt, wie es nötig ist, um über die Liste zu iterieren, was bedeutet, dass UIAlertController beim Versuch, eine Frage auf eine andere zu überlagern, verwirrt wird. Was ich will, ist für die Versprechen, zu verketten, so dass erst, wenn der Benutzer "Ja" oder "Nein" ausgewählt hat (und der nachfolgende "überschreiben" - oder "nicht überschreiben" -Code ausgeführt hat), die nächste Iteration der for Schleife passieren. Im Wesentlichen möchte ich, dass die gesamte Sequenz sequenziell ist.
Wie kann ich diese Versprechen verketten, wenn man bedenkt, dass das Array von unbestimmter Länge ist? Ich habe das Gefühl, dass ich etwas Offensichtliches vermisse.
Bearbeiten: eine der folgenden Antworten schlägt Rekursion vor. Das klingt vernünftig, obwohl ich mir nicht sicher bin, welche Auswirkungen dies auf Swifts Stack haben wird (das ist in einer iOS-App), wenn die Liste länger wird. Ideal wäre, wenn es ein Konstrukt gäbe, um dies natürlicher zu machen, indem man das Versprechen verkettet.
Entschuldigung für den Pseudocode - ich kenne Swift nicht. Aber das ist eine gute Frage, und ich denke, die Lösung ist ziemlich sprachunabhängig. – wchargin
Fühlen Sie sich frei zu bearbeiten und fügen Sie tatsächliche Swift! :) – wchargin
Im Wesentlichen schlagen Sie vor, Rekursion zu verwenden, denke ich. Das ist eine vernünftige Idee, wenn die Liste kurz ist. Ich bin ein bisschen besorgt wegen der Swift-Implikationen, wenn es länger wird (ich bin nicht genug von einem Swift-Experten, um zu wissen, ob das ernsthafte Konsequenzen hätte). –