2016-07-18 10 views
1

Ich arbeite an einem Projekt und ich muss eine Zeichenfolge in meiner XML-Datei durch eine Zeichenfolge ersetzen, die die Sprache der Untertitel durch Kommata getrennt enthält.Rückgabewert für eine Schließung Swift

Das Problem ist, dass ich meine Untertitel mit einer Schließung Funktion bekomme und ich kann keine Werte zurückgeben, aber ich muss in einer Variablen meine Untertitel speichern. Hier

ist ein Beispiel für meinen Code

func searchSubtitles(completion: ([String] -> Void)) { 
    // GET Request for subtitles 
    // .... 
    completion(["fr", "en", "it", "es"]) 
} 

func getSubtitles(completion:(String -> Void)) { 
    var subs = "" 
    searchSubtitles { (data) in 
    for i in 0 ..< data.count { 
     subs.appendContentsOf(data[i]) 
     subs.appendContentsOf(", ") 
    } 
    } 
} 

var SubStr: String { 
    // have to return the string who contains all subtitles 
} 

// ... 

myXMLFile = myXMLFile.stringByReplacingOccurrencesOfString("{{SUBS}}", withString: SubStr) 
// Adding subs to my file 
+0

Assign 'subStr' auf den richtigen Wert innerhalb des Abschluss-Block. Aktualisieren Sie anschließend alle erforderlichen Benutzeroberflächen. – Connor

+0

@ConnorNeville Ich muss nicht aktualisieren UI – TheAbstractDev

Antwort

1

Vorausgesetzt, dass Sie arbeiten mit API basiert auf asynchronen Abschluss Sie eine Schwierigkeit der Arbeit prozedural haben (wenn Funktionen Werte zurückgeben und dann rufen Sie andere Funktionen).

Callbacks (Abschluss-Handler) Modell schlägt die Verwendung von Rückgabewerten aus dem Complete-Handler vor.

Mit anderen Worten - möchten Sie vielleicht Ihre myXMLFile.stringByReplacingOccurrencesOfString() Anruf INTO getSubtitles() Abschluss-Handler verschieben.

+0

Ich habe es getan, ich rief 'getSubtitles()' auf meinem 'init()', aber es heißt am Ende – TheAbstractDev

+0

Ich denke, es sollte wie 'getSubtitles {subStr in myXMLFile.stringByReplacingOccurrencesOfString ("{{SUBS}}", withString: subStr) } ' – Jeff

0

ich glaube, Sie Semaphore für dieses Problem verwenden können:

func getSubtitles() -> String { 
    let sem = DispatchSemaphore(value: 0) 
    var subs = "" 
    searchSubtitles { (data) in 
    for i in 0 ..< data.count { 
     subs.appendContentsOf(data[i]) 
     subs.appendContentsOf(", ") 
    } 
    sem.signal() 
    } 
    sem.wait(timeout: .distantFuture) 
    return subs 
} 

var SubStr: String { 
    // have to return the string who contains all subtitles 
    return getSubtitles() 
} 
Verwandte Themen