图片视图导致尴尬的挂起?

时间:2013-05-14 13:03:30

标签: ios asynchronous uiimageview notifications

我已经在这几天工作了(关闭和开启)并且我不是确切地确定为什么这不起作用,所以我问你的专业人士SOF有一些见解。

NewsItem.m

在我的第一个视图控制器上,我正在阅读包含10个以上项目的JSON Feed。每个项目都由NewsItem视图表示,该视图允许标题,正文和小图像。 UIImageViewIBOutlet名为 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 ,如果确定当前通知有此特定文章的图片,则会使用相同的图片作为自己的参考,如下所示:< / p>

- (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
  • 时,应用会挂起

如果我注释掉可疑行,该应用永远不会挂起。就这样,我的应用程序挂起,直到所有图像都加载完毕。我的想法是:

  1. 这是网络线程冲突(不太可能)
  2. 这是GPU线程冲突(可能在调整容器视图的大小时?)
  3. 以前有人见过这样的事吗?

1 个答案:

答案 0 :(得分:1)

对于延迟加载表格视图图像,可用的选项很少。可以在您的设计中使用它们以节省时间并避免重新发明轮子的努力。
1。 Apple延迟加载代码 - link
2。 SDWebImage - link

SDWebImage将为您提供一个完成处理程序/块,您可以使用通知机制通知应用程序的其他模块。

干杯!
阿玛尔。