あなたがしなければならないことは次のとおりだと思います:
画像のダウンロード中にテーブル セルにプレースホルダー画像を表示します (そうしないと、テーブルが空に見えます)。
ダウンロードした画像がそこにある場合は、更新メッセージをテーブルに送信します。
2 の場合、次の 2 つのアプローチがあります。
簡単なもの:reloadData
テーブル ビューに送信します (そして、アプリのパフォーマンスを確認します)。
テーブル ビューにメッセージを送信します。
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
を使用するreloadRowsAtIndexPaths
方がはるかに優れていますが、どの画像がどのテーブル行に関連付けられているかを追跡する必要があります。
NSFetchedResultController
Core Data を使用して画像を保存する場合、このワークフローはテーブル ビューと統合することではるかに簡単になることに注意してください。例については、こちらを参照してください。
繰り返しますが、別のアプローチは KVO を使用することです。
この監視メソッドを ItemsViewCell で宣言します。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"thumbnail"]) {
UIImage* newImage = [change objectForKey:NSKeyValueChangeNewKey];
if (newImage != (id)[NSNull null]) {
self.thumbContainer.image = newImage;
[self.thumbContainer setNeedsLayout];
}
}
}
次に、セルを構成するときに次のことを行います。
RSSItem *item = [[channel items] objectAtIndex:[indexPath row]];
cell.titleLabel.text = [item title];
cell.thumbContainer.image = [item thumbnail];
[item addObserver:cell forKeyPath:@"thumbnail" options:NSKeyValueObservingOptionNew context:NULL];
これにより、指定された「サムネイル」キーパスが変更cell
されるたびに に通知されます。item
別の必要な変更は、次のように割り当てを行うことです。
self.thumbnail = [UIImage imageWithData:tempData];
(つまり、 を使用self.
)。
別の編集:
Apple の LazyTableImages の例と同じように、画像をダウンロードしてロードしたかったのです。減速してドラッグしていない場合、画面上の画像のみが読み込まれ、すべての画像が一度に読み込まれるわけではありません。
ここではさまざまな問題について話しているのではないかと思います。
ここでの問題は、ダウンロードした画像が正しく表示されなかったことだと思いました(テーブルをスクロールしない場合)。これはあなたの質問から私が理解していることであり、私の提案はその問題を解決します。
遅延読み込みに関しては、実行していること (フィード全体をダウンロードしてから全体としてアーカイブすること) と希望すること (遅延読み込み) の間にある種の不一致があります。この 2 つのことは一致しないため、自分が行っていることを再考する必要があります。
これに加えて、画像の遅延読み込みが必要な場合は、次の手順に従うことができます。
に画像を読み込まずparser:foundCDATA:
、画像の URL を保存するだけです。
で画像のダウンロードを開始しますtableView:cellForRowAtIndexPath:
(URL がわかっている場合は、別のスレッドで行っているように dataWithContentOfURL を使用できます)。
上記のコードは、画像があるときにテーブルを更新します。
最初は、スクロール/ドラッグについて心配する必要はありません。1-2-3 を機能させるだけです。
機能したら、スクロール/ドラッグ デリゲートを使用して、スクロール/ドラッグ中に画像がダウンロードされないようにします (ポイント 2)。テーブルビューにフラグを追加して、フラグに tableView:cellForRowAtIndexPath:
「スクロール/ドラッグなし」と表示されている場合にのみ画像をダウンロードできます。
最終結果に到達するには、これで十分だと思います。これは非常に些細なことなので、コードは書きません。
PS: 画像を遅延ロードすると、フィードは画像なしでディスクに保存されます。CGD グループと CGD 待機を削除することもできます。私が言ったように、これを回避する方法はありません: 遅延読み込みを行うと同時にフィードで画像をアーカイブすることはできません (新しい画像を取得するたびにフィード全体をアーカイブしない限り)。画像をキャッシュする別の方法を見つける必要があります。