NSURLConnection sendSynchronousReques 替换

NSURLConnection sendSynchronousReques replacement

我有一段用 obj-c 编写的代码,我试图在 Swift 3 中进行翻译,但我遇到了 NSURLConnection.sendSynchronousRequest,它已被弃用,而且据我所知不好,因为它正在使用同步操作。

这是代码:

 NSData *responseData = [NSURLConnection sendSynchronousRequest:requestData returningResponse:&response error:&requestError];
 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];

你对我如何以更好的方式重写这篇文章有什么建议吗?为什么会这样?

这是您发出异步请求所需的最少代码,如果您要替换大量调用,您应该制作一个 API 层并重用代码而不是 copy/pasta 到处都是。

let url = URL(string: "http://myURL.com")!;
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        let dictionary = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments)
}
task.resume()

这样试试

var request = NSMutableURLRequest(URL: NSURL(string: "request url")!)
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"

var params = ["username":"username", "password":"password"] as Dictionary<String, String>

request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: [])

request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
    print("Response: \(response)")})

task.resume()

URLSession 是 iOS 7 中引入的 NSURLConnection 的替代品。 URLSession class 和相关的 classes 提供了 API 用于通过 HTTP/HTTPS 协议下载内容。 URLSession API 默认是异步的。

下面是使用 URLSession 的简单 Get 请求 API

 public func simpleNetworkRequest(completion: @escaping (_ JSON: [[String: Any]]?, _ error: Error?) -> Void) {

        // Set up the URL request
        let todoUrl: String = "https://jsonplaceholder.typicode.com/todos/1"

        guard let url = URL(string: todoUrl) else {
            print("Error: cannot create URL")
            return
        }

        let urlRequest = URLRequest(url: url)

        // set up the session
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)

        // make the request
        let task = session.dataTask(with: urlRequest) { (data, response, error) in

            guard error != nil else {
                print(error!.localizedDescription)
                completion(nil, error)
                return
            }

            // make sure we got data
            guard let responseData = data else {
                print("Error: did not receive data")
                completion(nil, nil)
                return
            }

            // parse the result as JSON, since that's what the API provides
            do {
                guard let JSON = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: AnyObject] else {
                    print("error trying to convert data to JSON")
                    completion(nil, nil)
                    return
                }

                print("JSON response : \(JSON)")

                //code to parse json response and send it back via completion handler
                let result = JSON["result"] as? [[String: Any]]
                completion(result, nil)

            } catch let error {
                print(error.localizedDescription)
                completion(nil, error)
            }
        }

        task.resume()
    }

以下是让您陈述的免费资源

https://videos.raywenderlich.com/courses/networking-with-nsurlsession/lessons/1

https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started

或者您可以使用Alamofore(推荐)来发出网络请求

发出请求的简单示例是

    Alamofire.request("https://httpbin.org/get").responseJSON { response in
        print(response.request)  // original URL request
        print(response.response) // HTTP URL response
        print(response.data)     // server data
        print(response.result)   // result of response serialization

        if let JSON = response.result.value {
           print("JSON: \(JSON)")
        }
    }