Swift 3和NSURLSession问题

时间:2016-06-14 15:27:04

标签: swift3 nsurlsession ios10

感谢Apple我的iOS 9项目' Swift 2.3'完全无法使用iOS 10' Swift 3' ...

我修复了几乎所有内容,除了我遇到使用NSURLSession的问题,Xcode告诉我它已经重命名为URLSession,如果我重命名它Xcode会告诉我:

  

使用未声明的类型URLSession

导入基金会。

问题是什么?!

例如我这样使用它......

lazy var defaultSession: URLSession = {
    let configuration = URLSessionConfiguration.background(withIdentifier: "reCoded.BGDownload")
    configuration.sessionSendsLaunchEvents = true
    configuration.isDiscretionary = true
    let session = URLSession(configuration: configuration, delegate: self, delegateQueue, queue: nil)
    return session
}()

甚至与委托方法相同的问题。

5 个答案:

答案 0 :(得分:7)

尝试使用Foundation.URLSession时使用URLSession

答案 1 :(得分:2)

/让它工作/在某些情况下尝试将代码复制到其他地方,然后删除使用URLSession的类中的所有内容,然后再次键入会话方法并放回复制的代码,您应该没问题。< / p>

答案 2 :(得分:1)

使用以下命令更新您的URLSessin功能;

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    self.data.append(data as Data)  
}

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    if error != nil {
        print("Failed to download data")
    }else {
        print("Data downloaded")
        self.parseJSON()
    }
}

答案 3 :(得分:0)

我可以解释一下,但是通过玩这些代码,我得到了这个在两天的挫折之后在SWIFT 3中工作。我猜SWIFT 3删除了很多不必要的单词。

let task = Foundation.URLSession.shared.dataTask(with: <#T##URL#>, completionHandler: <#T##(Data?, URLResponse?, Error?) -> Void#>)

答案 4 :(得分:0)

这就是我现在的位置。它不完美但可能有一半的时间可以工作。

首先,在我的URLsession定义的类中:

import Foundation
class Central: NSObject, URLSessionDataDelegate, URLSessionDelegate, URLSessionTaskDelegate, URLSessionDownloadDelegate {

我不认为所有这一切都是必要的,但确实如此。然后这是我的后台提取调用的函数:

func getWebData() {
    var defaults: UserDefaults = UserDefaults.standard
    let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: "myBGconfig")
    let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil)
    urlString = "https://www.powersmartpricing.org/psp/servlet?type=dayslider"
    if let url = URL(string: urlString) {
    let rateTask = backgroundSession.downloadTask(with: URL(string: urlString)!)
    rateTask.taskDescription = "rate"
    rateTask.resume()
}

当任务回来时:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL ) {
    if downloadTask.taskDescription == "rate" {  // I run 2 web tasks during the session
        if let data = NSData(contentsOf: location) {
           var return1 = String(data: data as! Data, encoding: String.Encoding.utf8)!
             DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now() + 0.2){
                var defaults: UserDefaults = UserDefaults.standard
                defaults.set(myNumber, forKey: "electricRate") // myNumber is an extract of the text in returned web data
                defaults.set(Date(), forKey: "rateUpdate")
                defaults.synchronize()
                self.calcSetting()  //Calls another function defined in the same class.  That function sends the user a notification.
                let notificationName = Notification.Name("GotWebData")
                NotificationCenter.default.post(name: notificationName, object: nil)
            }   //  Closes the Dispatch
        }
      if session.configuration.identifier == "myBGconfig" {
          print("about to invalidate the session")
          session.invalidateAndCancel()
       }
}

我还没知道如何在BOTH任务完成时杀死会话,所以现在当任何一个完成时我杀了它,并且上面的invalidateAndCancel。

最后,要抓住错误:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didCompleteWithError: Error?) {
      if downloadTask.taskDescription == "rate" {
        print("rate download failed with error \(didCompleteWithError)")
    }
    if downloadTask.taskDescription == "other" {
        print("other download failed with error \(didCompleteWithError)")
    }
 downloadTask.resume()  //  I'm hoping this retries if a task fails?
}

func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {
    if let error = error as? NSError {
        print("invalidate, error %@ / %d", error.domain, error.code)
    } else {
        print("invalidate, no error")
    }
}