2015-07-07 8 views
18
class PostFOrData { 
    let url = NSURL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") 
    var picUrl = NSURL(string : "http://210.61.209.194:8088/SmarttvMedia/img/epi00001.png") 
    var responseString : NSString = "" 

    func forData() -> NSString { 

     let request = NSMutableURLRequest(URL: url!) 
     request.HTTPMethod = "POST" 
     var s : NSString = "" 

     let postString : String = "uid=59" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      if error != nil { 
       println("error=\(error)") 
       return 
      } else { 
       println("response = \(response!)") 
       self.responseString = NSString(data: data, encoding: NSUTF8StringEncoding)! 
       println("responseString = \(self.responseString)") 
      } 

     } 

     // I want to return NSString here, but I always get nothing 

     return self.responseString 

    } 
} 

Wer weiß, wie man die Daten von Aufgabe erhalten?Wie bekomme ich die Daten von NSURLSession.sharedSession(). DataTaskWithRequest

+0

Mögliches Duplikat [Laden/Herunterladen Bild von URL auf Swift] (https://stackoverflow.com/questions/24231680/loading-downloading-image-from-url -on-swift) –

Antwort

32

Sie können Daten nicht direkt von einer asynchronen Task zurückgeben.

Die Lösung mit Swift 2 ist eine Abschluss-Handler wie folgt zu machen:

class PostFOrData { 
    // the completion closure signature is (NSString) ->() 
    func forData(completion: (NSString) ->()) { 
     if let url = NSURL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") { 
      let request = NSMutableURLRequest(URL: url) 
      request.HTTPMethod = "POST" 
      let postString : String = "uid=59" 
      request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
      let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
       data, response, error in 
       if let data = data, 
        jsonString = NSString(data: data, encoding: NSUTF8StringEncoding) 
        where error == nil { 
         completion(jsonString) 
       } else { 
        print("error=\(error!.localizedDescription)") 
       } 
      } 
      task.resume() 
     } 
    } 
} 


let pfd = PostFOrData() 

// you call the method with a trailing closure 
pfd.forData { jsonString in 
    // and here you get the "returned" value from the asynchronous task 
    print(jsonString) 
} 

Auf diese Weise wird der Abschluss nur aufgerufen, wenn die asynchrone Aufgabe abgeschlossen ist. Es ist eine Möglichkeit, die Daten "zurückzugeben", ohne tatsächlich return zu verwenden.

Swift 3-Version

class PostFOrData { 
    // the completion closure signature is (String) ->() 
    func forData(completion: @escaping (String) ->()) { 
     if let url = URL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") { 
      var request = URLRequest(url: url) 
      request.httpMethod = "POST" 
      let postString : String = "uid=59" 
      request.httpBody = postString.data(using: String.Encoding.utf8) 
      let task = URLSession.shared.dataTask(with: request) { 
       data, response, error in 
       if let data = data, let jsonString = String(data: data, encoding: String.Encoding.utf8), error == nil { 
        completion(jsonString) 
       } else { 
        print("error=\(error!.localizedDescription)") 
       } 
      } 
      task.resume() 
     } 
    } 
} 


let pfd = PostFOrData() 

// you call the method with a trailing closure 
pfd.forData { jsonString in 
    // and here you get the "returned" value from the asynchronous task 
    print(jsonString) 
} 
+0

** 1) ** Das war schnell für Swift 3! ** 2) ** von einem Objective-C-Hintergrund kommend, ist es etwas verwirrend. In Swift wird kein Schlüsselwort "completionHandler" angezeigt. Ist das etwas abgeleitet? – Honey

+1

Ja. Es ist Standard Swift Syntax. Wenn am Ende einer Funktion eine Closure definiert ist, kann die Closure nach der closing ')' - Klammer definiert und der Parametername ausgeschlossen werden. Sie heißen abschließende Schließungen. Siehe https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html – user1956608

Verwandte Themen