我怎样才能从NSURLSession.sharedSession()。dataTaskWithRequest获取数据

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 } } 

任何人都知道如何从任务中获取数据?

您不能直接从asynchronous任务中返回数据。

Swift 2的解决scheme是制作一个完成处理程序,如下所示:

 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) } 

这样,完成只在asynchronous任务完成时调用。 这是一种“实际返回”数据的方式。

Swift 3版本

 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) }