0

ダウンロード後の 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の功績。これは他の人のためにここに残します...

4

0 に答える 0