###前提と実現したい事
Swift初心者です。
勉強のために色々なクラスを使ってクソアプリ(実用性の無いアプリ)を
何個か作っています。今回作っていたのは、
「URLSession等を使ってインターネットから特定の画像を取得しよう!」というものです。
今回聞きたいのは、URLSessionに関する処理です。
UIProgressBarを更新するためには、URLSessionが処理をしている途中に
呼び出す関数に更新のためにの処理を書けばいいと聞いたので書きました。
コンパイルこそ通ったのですが、シュミレータの方で動かしたときに思うような処理をしてくれません。助けて下さい!
###環境
swift4
Xcode10.1
MacOS 10.14.1
コード
コード全体です
import UIKit class ViewController: UIViewController, URLSessionDownloadDelegate { var queue:DispatchQueue? @IBOutlet weak var output: UILabel! override func viewDidLoad() { super.viewDidLoad() queue = DispatchQueue(label:"my app",qos:.userInteractive) } private func download(){ let url = URL(string: "https://example.com/OOOOO.JPG") let request = URLRequest(url: url!) let config = URLSessionConfiguration.default let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) let downloadTask = session.dataTask(with: request){(data ,responde , error)in if data == nil{ print("ダウンロード失敗") } if let imageData = data{ let image = UIImage(data:imageData) print(image)//確認のために出しています。 } } downloadTask.resume() } @IBAction func justDownload(_ sender: UIButton) { download() } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite) //UIProgressBarの更新などをしたいです // ダウンロードの進捗をログに表示 print(String(format: "%.2f", progress * 100) + "%") } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { //imageの保存など、ダウンロード完了時の処理をしたいです。 }
試したこと
初めはdataTask(){in}の中にUIProgressBarの処理を書いていましたが、inの中身は画像が取得し終わってから呼び出されることを知りました。
なので、改めて調べて直して
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { }
の中に更新のための処理を書きました。しかし、print(image)によって画像が正しくダウンロードされたのは、
確認できたものの、上記の関数が呼び出されないため、ProgressBarの更新ができません。
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
URLSessionDownloadDelegateをクラスのデリゲイトとしているので、上記の宣言においてデリゲイトはselfにしてあります。
なのにうまくい行きません。どうして何でしょうか。教えてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。