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?
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.
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.
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) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With