0

我已经为此工作了几天(断断续续),我不确定为什么这不起作用,所以我向 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

如果我注释掉可疑行,应用程序永远不会挂起。因为它,我的应用程序挂起,直到所有图像都被加载。我的想法是:

  1. 这是网络线程冲突(不太可能)
  2. 这是一个 GPU 线程冲突(可能在调整到容器视图的大小期间?)

有没有人见过这样的事情?

4

1 回答 1

1

对于表视图图像的延迟加载,可用的选项很少。可以在您的设计中使用它们以节省时间并避免重新发明轮子。
1.苹果懒加载代码——链接
2.SDWebImage——链接

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

干杯!
阿马尔。

于 2013-05-14T13:14:33.610 回答