2017-10-29 29 views
0

現在、ダウンロードタスクを使用しているときにユーザーインターフェイスのアップデートに問題があります。次の関数はユーザーインターフェイスを更新する必要がありますが、ときどき動作します。なぜ私はファイルをダウンロードするたびに動作しませんか?毎回NSLogのログがデバッガに表示されます。urlSessionのUIアップデートが動作しませんdownloadTask didWriteData

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { 
    let curDownloadSize = totalBytesWritten/(1024*1024) 
    let totalDownloadSize = totalBytesExpectedToWrite/(1024*1024) 

    if curDownloadSize != oldDownloadSize { 
    DispatchQueue.main.async { 
     self.progressLabel!.text = "\(self.curDownloadSize)MB/\(self.totalDownloadSize)MB" 
     self.progressView!.progress = Float(totalBytesWritten)/Float(totalBytesExpectedToWrite) 
     NSLog("Download progress: \(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite))"); 
    } 
    } 
} 

progressLabelprogressViewは、この時点で、両方可能です。

私は同じファイルを複数回テストしましたが、時にはうまく動作することもありますが、うまく動作しないことがあります。

更新:私はこの

DispatchQueue.global(qos: .utility).async { 
    DispatchQueue.main.async { 
    (same as above) 
    } 
} 

のような二ディスパッチキューを使用して読んこれもただ時々働いています。

+0

そのメソッド内でDispatchQueueを使用する必要はありません。 –

+0

これは、DispatchQueueと同じくらい頻繁には機能しないという点を除いて、同じ結果を前に試しました。 – who9vy

+0

複数のダウンロードを同時に行っていますか?ラベルは1つだけです。新しいセッションを開始する前に、以前のセッションタスクをキャンセルしてください。 –

答えて

0

最近、私はこの問題を解決しました。

問題が発生するのは、あまりにも多くのイベントがメインキューにプッシュされた場合です。それはちょうど非常に良いインターネット接続で発生しました。この場合、コールバックはあまりにも頻繁に呼び出されています。

私のソリューションは:

progressCounter += 1 
if progressCounter % 30 == 0 { 
    DispatchQueue.main.async { 
    self.progressLabel!.text = "\(self.curDownloadSize)MB/\(self.totalDownloadSize)MB" 
    self.progressView!.progress = Float(totalBytesWritten)/Float(totalBytesExpectedToWrite) 
    NSLog("Download progress: \(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite))"); 
    } 
} 

progressCounter前に0に初期化されています。

関連する問題