Avatar
Kishikawa Katsumi 11/18/2017 9:25 AM
@TetsuFe 期待した通りに動かない理由はお書きになった通りです。UIが更新されるためにはイベントループに処理を戻す必要があるので、一連のメソッドの間でaddSubview(_:)removeFromSuperView()をしてしまうと、結果としてビューが外された最後の状態でUIが更新されます。
9:27 AM
download()は同期的な処理ですか?最も望ましいと思われる解決はdownload()メソッドを非同期処理にして完了時点でコールバックを受け取れるようにして、addSubview(_:) を呼んでからdownload()、ここまでは同じで、removeFromSuperView()をダウンロード完了のコールバック内で呼ぶことです。
9:28 AM
それが難しければ、addSubview(_:)の直後に一度イベントループに処理を戻してUIを更新して、download()removeFromSuperView()を呼びます。
9:32 AM
view.addSubview(uiView) DispatchQueue.main.async { self.download() uiView.removeFromSuperView() }
9:33 AM
後者の方法はこんな感じですね。簡単ですけど良いコードではないのでオススメしませんが、元のコードがなぜ期待した通りに動かなかったのかはよくわかると思います。