0

私はこれに数日間取り組んできましたが(オフとオン)、なぜこれが機能しないのか正確にはわかりません.SOFのプロに洞察を求めています.

NewsItem.m

私の最初のView Controllerでは、10以上のアイテムを持つJSONフィードから読んでいます。NewsItem各アイテムは、タイトル、本文のコピー、小さな画像を表示できるビューで表されます。にUIImageViewは、IBOutletというimageViewがあります。imageViewの画像を非同期で読み込んでいます。画像が読み込まれると、 IMAGE_LOADEDという通知が送信されます。この通知は、NewsItemArticleでのみ取得されます

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//this will start the image loading in bg
dispatch_async(concurrentQueue, ^{
    NSData *image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:self.imageURL]];
    //this will set the image when loading is finished
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.imageView setAlpha:0.0];
        self.image = [UIImage imageWithData:image];
        [self.imageView setImage:self.image];
        [UIView animateWithDuration:0.5 animations:^{
            [self.imageView setAlpha:1.0];
        }];

        if(self)
        [[NSNotificationCenter defaultCenter] postNotificationName:IMAGE_LOADED object:self];
    });
});

NewsItemArticle.m

ユーザーがNewsItemViewをタップすると、スクロールビュー内のいくつかのNewsItemArticleビューのスクロール ビューである新しいコントローラーが読み込まれます。NewsItemArticleはIMAGE_LOADEDをリッスンし、現在の通知にこの特定の記事の画像があると判断された場合、次のように独自の参照用に同じ画像を使用します。

- (void)handleImageLoaded:(NSNotification *)note
{
    if([note.object isEqual:self.cell]) {
        // this next line is hanging the app. not sure why.
        [self.imageView setImage:self.cell.image];
        [self.activityViewIndicator removeFromSuperview];
    }
}

したがって、本質的に:

  • 最初の画像参照で非同期ロードを使用しています
  • 通知を使用して、アプリの他の部分に通知し、画像が読み込まれたことを知らせています
  • 既存の画像が 2 番目を参照しているときにアプリがハングするUIImageView

疑わしい行をコメントアウトすると、アプリがハングすることはありません。そのため、すべての画像が読み込まれるまでアプリがハングします。私の考えは次のとおりです。

  1. これはネットワーク スレッドの競合です (可能性は低い)
  2. これは、GPU スレッドの競合です (おそらく、コンテナー ビューのサイズへのサイズ変更中ですか?)

誰もこのようなものを見たことがありますか?

4

1 に答える 1

1

テーブル ビュー イメージの遅延読み込みに使用できる適切なオプションはほとんどありません。設計でそれらを利用して時間を節約し、車輪を再発明する努力を避けることができます。
1. Apple 遅延読み込みコード --リンク
2. SDWebImage --リンク

SDWebImage は、通知メカニズムを使用してアプリケーションの他のモジュールに通知できる完了ハンドラー/ブロックを提供します。

乾杯!
アマール。

于 2013-05-14T13:14:33.610 に答える