UIImageView+AFNetworking 图像请求队列阻塞来自 RestKit 的其他网络请求

Posted

技术标签:

【中文标题】UIImageView+AFNetworking 图像请求队列阻塞来自 RestKit 的其他网络请求【英文标题】:UIImageView+AFNetworking image request queue blocks other network requests from RestKit 【发布时间】:2013-02-16 12:10:14 【问题描述】:

我通过创建 RKObjectRequestOperations 并将它们添加到 RestKit 的队列中来使用 RestKit 下载数据:

RKObjectRequestOperation *operation = [RK objectRequestOperationWithRequest:request
       success:...
       failure:...];
[RK enqueueObjectRequestOperation:operation];

那个很好用。此外,此数据显示在列表视图中,其中包含显示相关用户图标的 UIImageViews。然而,这些用户图标不是通过 RestKit 下载的,而是通过底层的 AFNetworking 库下载的。 UIImageView+AFNetworking 也做得很好(包括缓存):

[self setImageWithURLRequest:userIconRequest
            placeholderImage:anonymousUser
                     success:nil
                     failure:...];

问题是来自图像视图的这 15 个用户图标请求阻止了应该立即加载下一页的 RestKit 请求的处理。我可以看到显示“正在加载”行的列表以及第一个用户图标。在最后一张图片完成加载的那一刻,下一页会自行附加。

查看 UIImageView+AFNetworking 的实现表明它正在使用自己的 NSOperation 队列实例来序列化请求。但是,我想这不应该干扰 RestKit。

在所有请求中添加NSOperationQueuePrioritys 也不会改变任何事情。也许在内部,网络请求以不同的方式序列化?如何确定这些请求的优先级?

提前致谢。

【问题讨论】:

【参考方案1】:

NSURLConnection 具有未记录的最大连接数。

此外,UIImageView+AFNetworking 的操作队列具有NSOperationQueueDefaultMaxConcurrentOperationCount 的最大当前请求数,根据this convincing-sounding AFNetworking discussion,这对于您的用例来说可能是一个糟糕的选择。

您需要节流。我看到了两个简单的解决方案:

    UIImageView+AFNetworking 修改为拥有最多4 个并发操作。 修改 UIImageView+AFNetworking 以使用与 RestKit 相同的操作队列,在这种情况下,您设置的优先级很重要。

【讨论】:

以上是关于UIImageView+AFNetworking 图像请求队列阻塞来自 RestKit 的其他网络请求的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView+Afnetworking 无法正常工作

AFNetworking 和 UIImageView 更新线程问题

UIImageview+AFNetworking 淡入,图片缓存时也一样

使用 UIImageView+AFNetworking,图像直到滚动才会出现

使用 AFNetworking setImageWithURL 设置 UIImageView 圆角:

带有 UIActivityIndi​​catorView 参考内存的 UIImageView+AFNetworking 类别是不是保留?