0
私は以下のコードでいくつか問題があります。 動作しますが、タイミングに問題があります。session.dataタスク同期の問題
最初に私が期待していることを言えば、データのダウンロードが完了してイメージを使用できるようになると完了ハンドラを実行する必要があると思います。しかし、現実は全く異なるようです。私が試してみると、すぐに完了ハンドラが呼び出されます(コンソールで「すべてOK」と見ることができます)、すべてが瞬間的であるかのように。しかし、画像は実際にはずっと後に表示されます。私は何が欠けていますか?
let imageURL = URL(string: myURLString)
session = URLSession.shared,
_ = session.dataTask(with: imageURL) {[weak self]
(data: Data?, response: URLResponse?, error: Error?) in
if error == nil {
print("All OK")
self?.theImage = UIImage(data: data!)
self?.theView.image = self?.theImage
} else {print(error!)}
DispatchQueue.main.async {
self?.activityIndicator.stopAnimating()
self?.theView.setNeedsDisplay()
}
}.resume()
データがロードされ、サーバーから利用可能になると、ハンドラが再度呼び出されます。また、最後の中かっこの直前にsession.finishTasksAndInvalidate()を追加する必要があります。} .resume() –
OK。 「ハンドラが再び呼び出される」とはどういう意味ですか?すでに呼び出されています。何回も呼ばれることになっていますか? – Michel
データがフェッチされると、コントロールが再びハンドラに到達します。また、自己?theView.image = self?.theImageはメインスレッド上になければなりません。そして、どのバージョンのスウィフトを使っていますか? –