【问题标题】:sendAsynchronousRequest was deprecated in iOS 9, How to alter code to fixsendAsynchronousRequest 在 iOS 9 中已弃用,如何更改代码以修复
【发布时间】:2015-09-05 06:27:38
【问题描述】:

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

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,我不知道怎么做。

【问题讨论】:

  • 我认为 NSURLConnection 在 iOS8 中已被弃用。你应该从 iOS7 开始使用 NSURLSession。
  • 有什么问题?您对the documentation 理解有困难吗?
  • 是的,我不知道如何将其转换为使用dataTaskWtihReqeust,我不知道我需要更改什么。
  • 我同意 DarkDust,NSURSession 很容易理解。看看Ray的教程raywenderlich.com/51127/nsurlsession-tutorial
  • 光顾我也无济于事,但我是 swift 新手,更喜欢看到答案,然后在看到你所做的事情时有灵光乍现的时刻。我会看看但是这是Objectvice-C,知道swift中的任何教程吗?

标签: ios swift ios9


【解决方案1】:

使用NSURLSession 代替如下,

对于 Objective-C

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

  }] resume];

对于斯威夫特,

    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 docs

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

到一个完成处理程序块,该块将数据返回到您的应用程序,当 传输成功或出错。

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

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

【讨论】:

  • 如何确保请求异步运行?
  • @Supertecnoboff,我刚刚更新了我的答案。如果您仍有任何疑问,请告诉我。
  • 我在 &err 语句中得到一个错误:调用中的额外参数“错误”
  • 你好 Nilesh,在这个链接上的 Linkedin 上找到我..linkedin.com/in/khushal-patel-6108537b
【解决方案2】:

Swift 实现

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

}

【讨论】:

  • 别忘了你需要在你的dataTaskWithRequest 上调用resume(),否则它什么也做不了。
【解决方案3】:

斯威夫特 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()

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 感谢您的更新。苹果的开发环境开始令人困惑。一切都过时了!
    【解决方案5】:

    Swift 2.0:

    旧的(下面替换为新的):

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, data, error) -> Void in
    
    // Code
    
    }
    

    新:

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
    
    // Code
    
    }
    task.resume()
    

    【讨论】:

      【解决方案6】:

      斯威夫特 4

      let params = ["email":"email@email.com", "password":"123456"] as Dictionary<String, String>
      
      var request = URLRequest(url: URL(string: "http://localhost:8080/api/1/login")!)
      request.httpMethod = "POST"
      request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: [])
      request.addValue("application/json", forHTTPHeaderField: "Content-Type")
      
      let session = URLSession.shared
      let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
      
          do {
              let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
              print(json)
          } catch {
              print("error")
          }
      
      })
      
      task.resume()
      

      【讨论】:

        【解决方案7】:

        使用 swift 3.1

        let request = NSMutableURLRequest(url: NSURL(string: image_url_string)! as URL)
            let session = URLSession.shared
            request.httpMethod = "POST"
        
            let params = ["username":"username", "password":"password"] as Dictionary<String, String>
        
            request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: [])
        
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue("application/json", forHTTPHeaderField: "Accept")
        
            let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in
                print("Response: \(String(describing: response))")})
        
            task.resume()
        

        【讨论】:

          【解决方案8】:

          用一个例子来说明,弃用的替代代码:

          sendAsynchronousRequest(_:queue:completionHandler:)' 在 iOS 9.0 中已弃用:使用 [NSURLSession dataTaskWithRequest:completionHandler:]

          在 Swift 2.1 及更高版本中经过测试和工作。

          import UIKit
          
          class ViewController: UIViewController {
          
          
              @IBOutlet var theImage: UIImageView!
          
          
              override func viewDidLoad() {
                  super.viewDidLoad()
          
          
                  let url = NSURL(string: "https://upload.wikimedia.org/wikipedia/commons/6/6a/Johann_Sebastian_Bach.jpg")
          
          
                  let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) -> Void in
          
                      if error != nil {
                          print("thers an error in the log")
                      } else {
          
                          dispatch_async(dispatch_get_main_queue()) {
                          let image = UIImage(data: data!)
                          self.theImage.image = image
          
                          }
                      }
          
                  }
          
                  task.resume()
          
              }
          
          }
          

          //在 ViewControllers ImageView 上显示一个图像。连接ImageView的一个outlet

          【讨论】:

            【解决方案9】:

            这是带有 JSONSerialised 数据的 Nilesh Patel's Answer 的 SWIFT3.0 版本

            let url = URL(string: "<HERE GOES SERVER API>")!
                        var request = URLRequest(url: url)
                        request.httpMethod = "POST" //GET OR DELETE etc....
                        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                        request.setValue("<ValueforAuthorization>", forHTTPHeaderField: "Authorization")
                        let parameter = [String:Any]() //This is your parameters [String:Any]
                        do {
                            let jsonData = try JSONSerialization.data(withJSONObject: parameter, options: .prettyPrinted)
                            // here "jsonData" is the dictionary encoded in JSON data
                            request.httpBody = jsonData
                            let session = URLSession(configuration: .default)
                            let task = session.dataTask(with: request, completionHandler: { (incomingData, response, error) in
                                if let error = error {
                                    print(error.localizedDescription)
                                    print(request)
                                }else if let response = response {
                                    print(response)
                                }else if let incomingData = incomingData {
                                    print(incomingData)
                                }
                            })
                            task.resume()
            
                        } catch {
                            print(error.localizedDescription)
                        }
            

            【讨论】:

              【解决方案10】:

              斯威夫特 4.2

              这对我有用:

              func loadImageFromURL(URL: NSURL) {
                  let request = URLRequest(url: URL as URL)
                  let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
                      if let imageData = data {
                          DispatchQueue.main.async {
                              self.imageView.image = UIImage(data: imageData)
                          }
                      }
                  }
                  task.resume()
              }
              

              我不得不添加“DispatchQueue.main.async { }”,因为我有一个运行时警告,因为只有主线程应该修改 UI 元素。

              【讨论】:

                猜你喜欢
                • 2016-08-04
                • 1970-01-01
                • 1970-01-01
                • 2019-02-17
                • 1970-01-01
                • 2021-02-14
                • 1970-01-01
                • 2015-12-06
                • 1970-01-01
                相关资源
                最近更新 更多