私はこれに数日間取り組んできましたが(オフとオン)、なぜこれが機能しないのか正確にはわかりません.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
疑わしい行をコメントアウトすると、アプリがハングすることはありません。そのため、すべての画像が読み込まれるまでアプリがハングします。私の考えは次のとおりです。
- これはネットワーク スレッドの競合です (可能性は低い)
- これは、GPU スレッドの競合です (おそらく、コンテナー ビューのサイズへのサイズ変更中ですか?)
誰もこのようなものを見たことがありますか?