【问题标题】:App sudden crash loading url应用突然崩溃加载url
【发布时间】:2017-01-27 11:20:19
【问题描述】:

我有以下功能来加载数据。直到几天前,该功能还可以正常工作。该应用程序在尝试加载任何 url 时崩溃,请参阅下面的代码和屏幕截图。一年只写几天代码 ios/swift,很难弄清楚哪里出了问题……

class func loadDataFromURL(_ url: URL, completion:@escaping (_ data: Data?, _ error: NSError?) -> Void) {
let session = URLSession.shared

// Use NSURLSession to get data from an NSURL
let loadDataTask = session.dataTask(with: url, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in
  if let responseError = error {
    completion(nil, responseError)
  } else if let httpResponse = response as? HTTPURLResponse {
    if httpResponse.statusCode != 200 {
      let statusError = NSError(domain:"com.xyz", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
      completion(nil, statusError)
    } else {
      completion(data, nil)
    }
  }
} as! (Data?, URLResponse?, Error?) -> Void)

loadDataTask.resume()
}

【问题讨论】:

  • dataTaskcompletionHandler 的签名在 Swift 3 中被更改,所以这样称呼它。 let loadDataTask = session.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) -> Void in { }末尾不用加as! (Data?, URLResponse?, Error?) -> Void)
  • 你知道它在哪里崩溃了吗?如果没有,请在每一行之后放置一些断点和/或打印语句以找出答案。这让我们更接近为什么它崩溃了。

标签: ios swift swift3 nsurlsessiondatatask


【解决方案1】:

使用下面的代码和最新的 Swift 3.0 语法,它适用于 Xcode 8.2:-

func loadDataFromURL(_ url: URL, completion:@escaping (_ data: Data?, _ error: NSError?) -> Void) {
        let session = URLSession.shared

        // Use NSURLSession to get data from an NSURL

        let loadDataTask = session.dataTask(with: url) { (data, response, error) in
            if let responseError = error {
                completion(nil, responseError as NSError?)
            } else if let httpResponse = response as? HTTPURLResponse {
                if httpResponse.statusCode != 200 {
                    let statusError = NSError(domain:"com.xyz", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
                    completion(nil, statusError)
                } else {
                    completion(data, nil)
                }
            }
        }
        loadDataTask.resume()

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2017-03-27
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多