@H_404_1@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
}
}
任何人都知道如何从任务获取数据?
您不能直接从异步任务返回数据.
Swift 2的解决方案是完成一个完成处理程序:
@H_404_1@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,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) }这样,只有当异步任务完成时才调用完成.这是一种“返回”数据而不实际使用返回的方式.
Swift 3版本
@H_404_1@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,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) }