Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get the Data from 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      } } 

Anyone know how to get the data from task?

like image 222
Liang Avatar asked Jul 07 '15 09:07

Liang


People also ask

How do I use NSURLSession in Objective C?

NSURLSession introduces a new pattern to Foundation delegate methods with its use of completionHandler: parameters. This allows delegate methods to safely be run on the main thread without blocking; a delegate can simply dispatch_async to the background, and call the completionHandler when finished.

What is NSURLSession in Swift?

Overview. The NSURLSession class and related classes provide an API for downloading data from and uploading data to endpoints indicated by URLs. Your app can also use this API to perform background downloads when your app isn't running or, in iOS, while your app is suspended.


1 Answers

You can't return data directly from an asynchronous task.

The solution with Swift 2 is to make a completion handler like this:

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

That way, the completion is only called when the asynchronous task is completed. It is a way to "return" the data without actually using return.

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) } 
like image 62
Eric Aya Avatar answered Sep 28 '22 03:09

Eric Aya