UITableViewで遅延UIImageViewレンダリング
-
11-09-2019 - |
質問
[OK]を、私は、それぞれの画像UITableView
経由で非同期にダウンロードされているUITableViewCell
を含むカスタムUIImageView
sでNSURLConnection
を持っています。すべてのかなり標準のもの...
問題は、あるます。
どのように私は、それが動いている場合でも、コンテンツだレンダリングするためにテーブルを得るのですか? おかげます。
- UPDATE -
よく見た後、私はテーブルのスクロールを停止するまでNSURLConnection
のデリゲートメソッドが発射されていないことを発見しています。なぜわかりません。すべてのヘルプは素晴らしいことだ。
解決
UITrackingRunLoopMode
であるため、あなたがスクロールを停止するまでの接続デリゲートメッセージが発射されていない理由があります。デフォルトでは、NSURLConnection
スケジュール自体NSDefaultRunLoopMode
では唯一、あなたがスクロールしながら任意のメッセージを得ることはありません。
ここでUITrackingRunLoopMode
を含む「一般的な」モードでの接続を、スケジュールする方法は次のとおりです。
NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
initWithRequest:request
delegate:self
startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[connection start];
あなたはそれが始まった後でも実行ループモードを変更することができます示唆して、Appleのドキュメントに反するように思わ初期化子でstartImmediately:NO
を指定する必要があります注意ます。
他のヒント
あなたはNSRunLoop上に読んでください。私は、スクロール時に、実行ループがNSEventTrackingRunLoopModeで実行されている、と思われる、とNSURLConnectionは、そのモードには含まれていません。ダウンロードがスクロール中に起こることができるように:, forMode
:あなたはおそらくNSURLConnectionのscheduleInRunLoopを呼び出すことにより、この問題を回避できます。これはおそらく、おそらく最初の場所で別の実行ループモードの理由であるスクロールのパフォーマンスに影響します。しかし、それを試してみると、それはどのように感じてください!
、アップデートは、テーブルビューのスクロールとして発生します。
NSOperationのもう一つの利点は、セルがオフスクリーングライドとして、あなたが操作をキャンセルすることができます。それは、彼らはすぐに長いリストをスクロールする場合は特に...ユーザにとってより応答性の多くを感じるだろう。アップルのハイテクトークが、今年はこの手法を奨励します。
あなたのリストはそんなに長くはない、またはあなたがそれらをロードを継続することを好む場合は、は、あなたの代わりにNSOperationの優先順位を操作することができます。
まず...あなたの接続はおそらく、それはmainRunLoopへのを取得し、それがスクロールアニメーションも処理されているところだまでは開始されません。
私は同じ問題に遭遇し、画像が作成時にすぐに開始するための接続を伝えることで、それを固定します。
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper];
[connection start];
あなたが画像を受信し、受信した画像にcell.imageView.imageを設定完了ルーチンでは、このセルが現在の表に表示されている細胞のいずれかに属しているかどうかを確認...とあればすべきですので、[のtableView reloadData]を呼び出します。
NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage
NSArray *indicies = [_tableView indexPathsForVisibleRows];
NSUInteger rows = indicies.count;
if (rows > 0 &&
itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row &&
itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row)
{
[_tableView reloadData];
}