AFNetworking 和 UIImageView 更新线程问题

Posted

技术标签:

【中文标题】AFNetworking 和 UIImageView 更新线程问题【英文标题】:AFNetworking and UIImageView updating threading issues 【发布时间】:2012-07-18 16:27:00 【问题描述】:

所以我有一个带有自定义 UITableViewCells 的 UITableView,在我的自定义单元格中我有一个 UIImageView,我在其中使用 AFNetworking 类别来加载图像:

NSString *imageURLString = [[object.image_ valueForKey:@"low_resolution"] valueForKey:@"url"];
    NSURLRequest *imageURLRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURLString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
    [self.imageView_ setImageWithURLRequest:imageURLRequest andAnimate:YES placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)

    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
        NSLog(@"FAILED");
    ];

问题是,有时当您向下滚动时.. 在触发图像请求之前似乎有很长的延迟。我正在以非常好的连接进行测试。为什么会这样?

我不确定图像请求是在以后触发还是响应只是在以后才返回。但我看到的是,最初当应用程序加载图像时加载正常。当我向下滚动时,所有图像都是白色的。如果我耐心等待 60 秒,它就会加载。

【问题讨论】:

直到图像请求被触发,或者直到请求的图像被传输并且你的成功块被调用? 【参考方案1】:

一种可能的解释是,当您向下滚动列表时,您会发送大量请求,AFNetworking 在后台执行。

当您向下滚动时,发出的请求数量会增加,并且它们可能会以 FIFO 顺序在服务器端提供服务(也可能是服务器在将图像传输到您的应用时不会超过给定的带宽) ,所以当你停止滚动才能看到当前显示的图像时,你必须等待一堆以前的图像加载。

这可以解释您为什么会有延迟。我建议将 NSLog 跟踪放在您的成功处理程序中并记录请求 url,这样您就可以看到发生了什么:检查传入图像的流;查看传输每张图像需要多长时间。

一般来说,您尝试做的事情应该没问题,这就是为什么我在考虑由您发送的请求数量触发的服务器端问题。

【讨论】:

仅供参考,服务器是 Instagram API 的

以上是关于AFNetworking 和 UIImageView 更新线程问题的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 和请求标头

AFNetworking 和 JSON 参数

AFNetworking 和集合视图阻塞主线程

AFNetworking网络请求的get和post步骤

使用 AFNetworking 2 和可达性没有互联网连接警报

iOS 解析 JSON 和 AFNetworking