在iOS 9中,不推荐使用sendAsynchronousRequest,如何修改要修复的代码

Dom*_*yan 47 ios swift ios9

以下是我的代码我遇到的问题:

func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void)
{
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, error) -> Void in

        if ((error) != nil)
        {
            callback(feed: nil, error: error)
        }
        else
        {
            self.callbackClosure = callback

            let parser : NSXMLParser = NSXMLParser(data: data!)
            parser.delegate = self
            parser.shouldResolveExternalEntities = false
            parser.parse()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,从iOS 9开始,这已被弃用,并告诉我使用dataTaskWithRequest.有人可以帮我用dataTask更改sendAsync,我不知道怎么做.

Nil*_*tel 76

使用NSURLSession如下,

对于Objective-C

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:"YOUR URL"]
          completionHandler:^(NSData *data,
                              NSURLResponse *response,
                              NSError *error) {
            // handle response

  }] resume];
Run Code Online (Sandbox Code Playgroud)

对于斯威夫特,

    var request = NSMutableURLRequest(URL: NSURL(string: "YOUR 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()
Run Code Online (Sandbox Code Playgroud)

对于异步查询,来自Apple 文档

与大多数网络API一样,NSURLSession API是高度异步的.它以两种方式之一返回数据,具体取决于您调用的方法:

到传输成功或出错时将数据返回到应用程序的完成处理程序块.

通过在收到数据时调用自定义委托上的方法.

通过在下载到文件完成时调用自定义委托上的方法.


Ank*_*han 16

快速实施

let session = NSURLSession.sharedSession()
session.dataTaskWithRequest(request) { (data, response, error) -> Void in

}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记你需要在`dataTaskWithRequest`上调用`resume()`,否则它不会做任何事情. (8认同)

kar*_*rma 10

Swift 3.0

var request = URLRequest(url: URL(string: "http://example.com")!)
request.httpMethod = "POST"
let session = URLSession.shared

session.dataTask(with: request) {data, response, err in
    print("Entered the completionHandler")
}.resume()
Run Code Online (Sandbox Code Playgroud)


小智 9

这是swift 2.1版本:

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

let 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")

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

task.resume()
Run Code Online (Sandbox Code Playgroud)