Apple の遅延ローダー コード例を使用して、TableView に画像を読み込んでいます。ビュー コントローラーはナビゲーション スタック内にあるため、ユーザーはすばやくスクロールし、タップしてビューの外に移動できます。VC は IconDownloader クラスのデリゲートであり、このクラスは画像のダウンロードを行います。VC の dealloc で IconDownloader デリゲートを nil に設定しています。
ただし、スクロール デリゲート scrollViewDidEndDecelerating が発生し、画像の読み込みが発生するタイミングの問題がありますが、その間に viewWillDisappear が発生しますが、画像の読み込みイベントは既にキューに入れられています。これにより、デリゲートと同様にビューがなくなるとクラッシュが発生しますが、いずれにせよ IconDownloader はそのデリゲート メソッドを起動します。
したがって、次のように注文します。
- scrollViewDidEndDecelerating (これは loadImagesForOnscreenRows を呼び出します)
- viewWillDisappear
- loadImagesForOnscreenRows
また、nil ではなく、respondsToSelector を使用して IconDownloader のデリゲート ステータスをチェックしています。
そのため、viewWillDisappear に bool を設定し、delegate を nil に設定することになりました。次に、loadImagesForOnscreenRows で bool をチェックします。これを行うためのより良い方法があるように感じますが、私が読んだことはすべて、デリゲートを適切に処分していることを示しています。ほとんどの投稿では、IconDownloader からのデリゲートを保持しないことを推奨しています。他の人がこのソリューションについてどう思うか疑問に思っています。ありがとう!
コード:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self loadImagesForOnscreenRows];
}
- (void)loadImagesForOnscreenRows
{
if ([self.entries count] > 0 && !viewIsDisappearing)
{
...
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
viewIsDisappearing = TRUE;
self.iconDownloader.delegate = nil;
}
そして IconDownloader NSURL connectionDidFinishLoading で:
// call our delegate and tell it that our icon is ready for display
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(appImageDidLoad:)])
{
[delegate appImageDidLoad:self.indexPathInTableView];
}