我已经为此工作了几天(断断续续),我不确定为什么这不起作用,所以我向 SOF 的专业人士请教一些见解。
新闻项目.m
在我的第一个视图控制器上,我正在读取包含 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];
}
}
所以本质上:
- 我在我的第一个图像参考上使用异步加载
- 我正在使用通知让应用程序的其他部分知道并且图像已加载
- 当现有图像引用第二个时,应用程序挂起
UIImageView
如果我注释掉可疑行,应用程序永远不会挂起。因为它,我的应用程序挂起,直到所有图像都被加载。我的想法是:
- 这是网络线程冲突(不太可能)
- 这是一个 GPU 线程冲突(可能在调整到容器视图的大小期间?)
有没有人见过这样的事情?