2016-06-14 6 views
8

Благодаря компании Apple IOS мои 9 Проект «Swift 2,3» является полностью непригодным для использования с прошивкой 10-х годов «Swift 3» ...Swift 3 и NSURLSession выпуск

я установил почти все, кроме того, что я имею вопрос с помощью NSURLSession, Xcode говорит мне, что он был переименован в URLSession, если я переименовать его Xcode скажет мне:

использование необъявленной типа URLSession

Foundation импортируется.

В чем проблема ?!

Например, я использую это так ...

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

и даже с методами делегата и тот же вопрос.

+0

@EricD Я обновил описание, если вы его видите. – Raffi

+1

Нет проблем с URLSession в вашем коде для меня. Кажется, смешно, я знаю, но ... вы уверены, что используете Xcode 8? :) Если да, может быть какая-то противоречивая декларация где-то ... – Moritz

+0

@EricD Да, я уверен! Я еще раз проверю и посмотрю, что произойдет. Обновится, если я что-то найду. Спасибо друг. – Raffi

ответ

2

/В некоторых случаях попробуйте скопировать код в другом месте, затем удалите все в своем классе, который использует URLSession, затем снова введите методы сеанса и верните скопированный код, и все будет в порядке.

+0

Это сработало для меня таким образом. Кажется, что-то удаляет компилятор, как-то @Droppy – Raffi

+0

Есть ли шанс, что вы можете поделиться своим полным окончательным решением? Я изо всех сил стараюсь, чтобы мой фоновой URL-адрес выполнялся надежно. Документация сбивает с толку, и большая часть ее старой, а не для Swift 3. –

+0

Покажите мне свой код, который вас беспокоит, а затем я попытаюсь помочь – Raffi

6

Попробуйте использовать Foundation.URLSession где бы вы ни использовали URLSession.

+2

не могли бы вы объяснить, почему? –

0

Я могу объяснить, но, играя с кодом, я получил это, чтобы работать в SWIFT 3 после двух дней разочарования. Думаю, SWIFT 3 удалил много ненужных слов.

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

Я не понял, но как убить сессию, когда обе задачи завершения , так что прямо сейчас я убиваю его, когда он завершен, с 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") 
    } 
} 
+0

Я могу понять, почему ваша задача не всегда работает, когда вы создаете фоновый сеанс, установите его isDiscretionary свойство в false, и ваша задача всегда будет работать немедленно. Читайте здесь [isDiscretionary referance] (https://developer.apple.com/reference/foundation/urlsessionconfiguration/1411552-isdiscretionary) и для отмены сеансов читайте ответ здесь [Отмена NSURLSession] (http://stackoverflow.com/questions/21414823/how-do-you-know-when-the-nsurlsession-object-has-was-invalidated-by-ios) – Raffi

+0

Эта ссылка говорит, что значение по умолчанию isDiscretionary является ложным. Я все равно постараюсь, но это не имеет значения? Для отмены сеанса я приближаюсь. Я использую флаг, но возникла проблема синхронизации, потому что мой флаг установлен во время отправки. Решение о недействительности принимается слишком быстро, прежде чем флаг задачи будет установлен на «Готово». Работаю над этим. –

+0

Попробуйте и расскажите, что произойдет. По какой-то причине это работает для меня таким образом. – Raffi

1

Update ваши 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() 
    } 
}