0

Apple の遅延ローダー コード例を使用して、TableView に画像を読み込んでいます。ビュー コントローラーはナビゲーション スタック内にあるため、ユーザーはすばやくスクロールし、タップしてビューの外に移動できます。VC は IconDownloader クラスのデリゲートであり、このクラスは画像のダウンロードを行います。VC の dealloc で IconDownloader デリゲートを nil に設定しています。

ただし、スクロール デリゲート scrollViewDidEndDecelerating が発生し、画像の読み込みが発生するタイミングの問題がありますが、その間に viewWillDisappear が発生しますが、画像の読み込みイベントは既にキューに入れられています。これにより、デリゲートと同様にビューがなくなるとクラッシュが発生しますが、いずれにせよ IconDownloader はそのデリゲート メソッドを起動します。

したがって、次のように注文します。

  1. scrollViewDidEndDecelerating (これは loadImagesForOnscreenRows を呼び出します)
  2. viewWillDisappear
  3. 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];
}
4

1 に答える 1

0

ビュー コントローラを終了するときに、処理されたすべてのダウンロードをキャンセルしますか?

私が dealloc メソッドで行うことは次のとおりです。

for all iconDownloaders (I have a list of them){
  iconDownloader.delegate = nil;
  [iconDownloader cancelDownload];
}

cancelDownload は iconDownloader クラスのメソッドで、次のようになります。

- (void)cancelDownload
{
  [self.connection cancel]; //NSURLConnection
  self.connection = nil;    
  self.receivedData = nil;  //data collected while downloading in NSURLConnection Delegate Methods
}

この例を少し変更して使用すると、完全にうまく機能します。

そして、あなたのコメントの次の文に同意します。「ほとんどの投稿では、IconDownloader からのデリゲートを保持しないことを推奨しています。」

于 2012-12-04T22:20:00.163 に答える