一尘不染

在iOS 9中不推荐使用sendAsynchronousRequest,如何更改代码以进行修复

swift

以下是我遇到的代码:

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

从iOS
9开始不推荐使用此方法,并告诉我改用dataTaskWithRequest。有人可以帮我用dataTask更改sendAsync,我不知道该怎么做。


阅读 212

收藏
2020-07-07

共1个答案

一尘不染

NSURLSession像下面这样使用,

对于Objective-C

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

  }] resume];

对于Swift,

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

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

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

到完成处理程序块,该块在传输成功完成或发生错误时将数据返回到您的应用程序。

通过在接收数据时在自定义委托上调用方法。

下载到文件完成后,通过在自定义委托上调用方法。

2020-07-07