前提
要素 | バージョン |
---|---|
xcode | 8.2.1 |
Swift | 3.0.2 |
iPhone | 6s |
iOS | 10.2.1 |
問題
例えば以下のような、UIImageViewに描画しているUIImageを動的に書き換える関数がある
public func setImage(newImage: UIImage) { self.myImageView.image = newImage self.myImageView.setNeedsLayout() }
通常であれば、この関数を呼び出すとUIImageViewに表示される画像が書き換わるが、
この関数を非同期で呼び出した場合に、変更後の画像が描画されない、もしくは表示までラグが生じてしまう
解決策
どうやら、非同期で画像を更新した場合には、その瞬間に再描画が行われず、別途再描画を行うタイミングで合わせて画像も再描画されるらしい。
とのことなので以下のようにコードを修正し、強制的にメインスレッドで実行することで、非同期で呼び出しても画像が即時更新されるようになった。
public func setImage(newImage: UIImage) { DispatchQueue.main.async { self.myImageView.image = newImage self.myImageView.setNeedsLayout() } }
この問題はUIImageViewに関わらず、UIViewのサブクラス全般で起こりうる問題なので、備忘録として残しておく。