swift - 如何从 NSURLSession.sharedSession().dataTaskWithRequest 获取数据

标签 swift nsurlsession

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 的解决方案是创建一个如下的完成处理程序:

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

这样,只有当异步任务完成时才会调用完成。这是一种“返回”数据的方法,而无需实际使用 return

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

关于swift - 如何从 NSURLSession.sharedSession().dataTaskWithRequest 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167257/

相关文章:

为什么这个 ScrollView 不显示 subview ?

ios - UIPopoverBackgroundView contentViewInsets 必须由子类实现

ios - Alamofire URLRequestConvertible 无法在编码中转义 "/"

uiwebview - 应用传输安全性破坏了 Web View

ios - 为什么我们在这里使用 ephemeralSessionConfiguration?

swift - 拖动手势时将矩形限制到屏幕边缘

ios - 对于基于 Cognito 用户池的登录,如何使用 iOS/Swift 中的 startPasswordAuthentication 委托(delegate)切换到登录屏幕?

ios - 如何从 tableViewCell 访问 View 到 TableViewController

swift - 使用 NSURLSession 通过 Uber API 进行身份验证

iOS 9 : Crash on -[_NSXPCDistantObject methodSignatureForSelector:]