NSURLSessionDataTask: Funktion empfängt Daten, gibt sie aber nicht zurück

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSURLSessionDataTask: Funktion empfängt Daten, gibt sie aber nicht zurück

    Ich bin gerade bei meinen ersten Schritten mit NSURLSession. Ich möchte eine einfache Funktion schreiben, die eine URL entgegen nimmt und den HTML-Code zurückspielt. Der DataTask an sich funktioniert; über println(data) kann ich sehen, dass der Code ankommt. Allerdings asynchron. Mein return theResult am Ende der Funktion gibt nur den initialen Wert "#!?" zurück. Innerhalb des if data != nil {} kann ich allerdings kein return setzen, ebensowenig kann ich return am Ende der Funktion weglassen und bin demzufolge leider etwas ratlos, wie ich der Funktion sagen kann, dass sie erst returned, wenn Daten vorliegen?


    Quellcode

    1. func loadHTML(targetURL: String) -> String {
    2. var theTargetURL = NSURL(string:targetURL)
    3. var theResult = "#!?"
    4. var request: NSURLRequest = NSURLRequest(URL:theTargetURL)
    5. let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    6. let session = NSURLSession(configuration: config)
    7. let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
    8. println(NSString(data: data, encoding: NSASCIIStringEncoding))
    9. if error != nil {
    10. println(error.localizedDescription)
    11. theResult = "error"
    12. }
    13. if data != nil {
    14. theResult = NSString(data: data, encoding: NSASCIIStringEncoding)
    15. println("RECEIVED\t\t\(countElements(theResult)) CHARS")
    16. }
    17. });
    18. task.resume()
    19. return theResult
    20. }
    Alles anzeigen
  • Das dachte ich mir auch schon. Nur kann ich das return theResult am Ende der Funktion nicht weglassen, ergänze ich es im completionHandler erhalte ich die Fehlermeldung 'String is not convertible to Void'.
  • Ich glaube ihm ist noch nicht klar wie er seinen result string bekommen soll.
    Du kannst das über ein Protocol machen wenn du eine Klasse benutzt. Oder noch einfacher du übergibst der loadHTML Funktion einen completionHandler und übergibst in der Methode dataTaskWithRequest den loadHTML completionHandler oder rufst im completionHandler deinen loadHTML completionHandler auf ^^.
    ich hoffe du hast das verstanden bin schlecht im erklären
  • Nochmal im Ernst: Wenn ich das Zeug nur an einer Stelle brauche, dann lade ich es in der Klasse, in der ich auch die Daten benötige. Dann langt ja ein Completion-Handler. Wenn ich es an verschiedenen Stellen brauche, dann kann man über eine eigene Klasse nachdenken, die es lädt und dann das Ergebnis an einen Delegate liefert. Oder dieser Klasse einen Completion-Händler mitgeben, der dann einfach als Completion-Handler für NSURLSessionSessionTask fungiert

    ciao

    gandhi
  • Jo ich hätte halt ein Protocol gemacht ^^ aber ich dachte mir das mrtn.lxo nur schnell testen will wie NSURLSession funktioniert und jetzt nicht gleich eine Klasse oder ein Protocol schreiben will.
    aber ist jetzt auch egal :)

    Marius