2016-06-14 4 views
8

おかげで、私のiOS 9プロジェクトは、「2.3スウィフト」、私はNSURLSessionを使用して問題が生じていますことを除いてほとんどすべてを固定スウィフト3とNSURLSession問題

... iOS版の10年代「スウィフト3」と完全に使用不可能ですXcodeのは、私は名前を変更した場合のXcodeは私に教えてくれる、それがURLSessionに名前が変更されたことを私に語っている:

宣言されていないタイプの使用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 
}() 

とさえを使用しています。

+0

@EricD @EricD @EricD @EricD @EricD @EricDあなたがそれをご覧になれば説明を更新しました。 – Raffi

+1

私のコードでURLSessionに問題はありません。ばかげているように思えますが、Xcode 8を使用していますか? :)はいの場合、どこかで矛盾する宣言があるかもしれません。 – Moritz

+0

@EricDはい私は確信しています!私は再び確認し、何が起こるか見る。私が何かを見つけたら更新されます。ありがとう。 – Raffi

答えて

2

/動作しました/別の場所にコードをコピーしてから、URLSessionを使用するクラス内のすべてを削除してから、セッションメソッドをもう一度入力してください。

+0

それは私のためにこのように働いた。何らかの形でコンパイラの混乱を排除するようです@Droppy – Raffi

+0

あなたは完全な最終的な解決策を共有することができますか?バックグラウンドのURLセッションを確実に実行するために苦労しています。ドキュメンテーションは混乱しています。その多くは古いものでSwift 3のものではありません。 –

+0

あなたの問題を抱えているコードを表示してから助けてください。 – Raffi

6

Foundation.URLSessionURLSessionをどこでも使用してみてください。

+2

理由を説明していただけますか? –

0

私は方法を説明することができますが、私はこれをSWIFT 3で2日間の欲求不満の後に働くようにしました。私は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を使って、どちらかが完了したら上のようにkillします。エラーをキャッチする

そして最後に、:

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)/is-by-so-do-you-know-when-not-ss-been-been-by-ios) – Raffi

+0

isdiscretionaryのデフォルト値がfalseであるとの参照である。とにかく設定しようとしますが、それは問題ではありませんか?セッションをキャンセルするには、私は近づいています。私はフラグを使用していますが、ディスパッチ中にフラグが設定されているため、タイミングに問題がありました。タスクフラグが「完了」に設定される前に、無効化の決定が早すぎます。それに取り組む。 –

+0

それを試して、何が起こるか教えてください。何らかの理由で、私のためにこのように動作します。 – Raffi

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() 
    } 
} 
関連する問題