ダウンロード後の UIImageViews の表示に長い遅延があるという質問をよく見かけますが、私の質問には、ローカル ストレージからの読み取りに長い遅延が伴います。
UIImageViews の階層をローカル ファイルにアーカイブした後 ( ビュー階層とコンテンツをファイルに出力する方法の narohi の回答に従って)、それらをリロードする場合、ビューが実際に表示されるまでに 5 ~ 20 秒かかることがわかりました。メインビューとすべてのサブビューで setNeedsDiplay() を設定しているにもかかわらず、画面に表示されます。
読み込まれた UIView のカスタム サブクラスに含まれるデータをすぐにクエリできます。NSKeyedUnarchiver とすべての NS デコードとすべての init() が完了したことを示していますが、画像は画面に表示されません。長い間。次の再描画サイクルは 5 ~ 20 秒よりも短いのではないでしょうか?
PhotoLibrary からの画像がすぐに表示されるのは奇妙に思えますが、NSKeyedUnarchiver を使用してローカル ファイル ストレージから読み込まれたものはすべて「永久に」かかります。
ここで何が起こっているのか、どうすればこれをスピードアップできますか?
.
.
明確にするために、私の Swift コードの関連部分は次のようになります。
let view = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as! UIView!
if (nil == view) {
return
}
myMainView.addSubview(view)
view.setNeedsDisplay()
// now do things with the data in view ...which all works fine
のようなものを追加しても、私はそれを見つけます...
for subview in view.subviews {
subview.setNeedsDisplay()
}
...それは操作をスピードアップしません。
巨大なデータセットについても話しているわけではありません。リロードされているのは、単一のイメージビューである可能性があります。
ここで、 https://stackoverflow.com/a/28221670/4259243に示されているようなダウンローダーを使用してインターネットからダウンロードするときにこれらの遅延が発生していることにも気付きました ...しかし、ダウンローダーに完了メッセージを出力させるだけでなくダウンロードですが、(同期操作)data.writeToFile()が完了したとき(およびNSKeyedUnarchiverを使用してロードしようとする前)、これは、ダウンロードがまだ開始されているため、UIImageViewの再描画の遅延がそうではないことを示しています....そして私が言うように、データのプロパティを照会することができ、それはすべてメモリ内にあり、画面には表示されません。
更新: コメントに従って、Leo Dabus のアドバイスに従って、needsDisplay コードを dispatch_async に同封し、Paulw11 に従っていくつかの時間プロファイリングを行いました。タイムプロファイリング の結果へのリンクはこちら: https://i.imgur.com/sa5qfRM.png 20代。その間、何事も無さそう…?コードは文字通りしばらく待っているだけですか?
私がどのようにdispatch_asyncを実装しているかを明確にするために、ここを参照してください:
func addViewToMainView(path: String) {
let view = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as! UIView!
if (nil == view) {
return
}
dispatch_async(dispatch_get_main_queue(), {
self.myMainView.addSubview(view)
view.setNeedsDisplay()
self.myMainView.setNeedsDisplay()
})
}
...これを投稿して以来、人々が NSKeyedUnarchiver の遅さについて不平を言っている投稿をいくつか見つけました。それだけでしょうか?もしそうなら、 :-(。
2番目の更新:ああ、「let view =」はdispatch_asyncにある必要があります。実際、すべてをdispatch_asyncに入れるだけで、見事に動作します! それで...
func addViewToMainView(path: String) {
dispatch_async(dispatch_get_main_queue(), {
let view = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as! UIView!
if (nil == view) {
return
}
self.myMainView.addSubview(view)
view.setNeedsDisplay()
self.myMainView.setNeedsDisplay()
})
}
これは即座に機能します。うわー.. Leo Dabusの功績。これは他の人のためにここに残します...