UIImageView+AFNetworking setImageWithURLRequest 使用 RestKit?

Posted

技术标签:

【中文标题】UIImageView+AFNetworking setImageWithURLRequest 使用 RestKit?【英文标题】:UIImageView+AFNetworking setImageWithURLRequest uses RestKit? 【发布时间】:2014-03-18 20:24:43 【问题描述】:

我将 RestKit (0.20.0) 用于我的 Rest Api 实现 - 所有 GET、POST 等。GET 返回一些图像的 url。我正在使用 UIImageView+AFNetworking setImageWithURLRequest 函数来下载这些。我很惊讶地看到这些提取的 RestKit 日志被打印出来,所以我做了一些调试。似乎 AFNetworking 发送了一些通知,最终落在 RestKit 上。

看起来它正在发生,因为 AFNetworkingOperationDidStartNotification 被触发以获取图像,并且 RK 已在 RKObjectRequestOperation.m 中注册此通知。

        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(HTTPOperationDidStart:)
                                                 name:AFNetworkingOperationDidStartNotification
                                               object:nil];

我的问题是 -

    考虑到我在使用此 api 背后的想法是确保图像获取在与 RK 完全分离/独占的线程中,这对我来说是否重要。

    这会影响我的 CoreData 实现吗?这张图片会被缓存吗?我猜这不会是因为我没有明确存储它,但如果这些操作开始在与 Rest api 操作相同的池中发生,它可能会影响性能吗?

    这是正确的实现方式吗?我是否应该在 CoreData 中也缓存图像而不使用 AFNetworking api?

    稍微偏离但相关的主题 - 我计划从服务器获取数百个项目,每个项目也可以有很多项目。并且每个都将有图像。所以它是一个相当重的网络应用程序。是否有任何最佳实践来管理这些请求的限制以避免性能问题?

提前谢谢你的帮助..

【问题讨论】:

【参考方案1】:

考虑到我在使用这个 api 背后的想法是确保图像提取在与 RK 完全分离/独占的线程中,这对我来说是否重要。

不,不应该。该请求仍将在不同的线程上运行。

这会影响我的 CoreData 实施吗?这张图片会被缓存吗?我猜这不会是因为我没有明确存储它,但如果这些操作开始在与 Rest api 操作相同的池中发生,它可能会影响性能吗?

图像只会缓存在内存中(如果内存可用)。一般来说,我同意@m-farhan 的观点,SDWebImage 会是一个更好的选择,不是要从 Core Data 中分离出来,而是要将图像缓存到磁盘上,这样你就不会继续下载它们了。通常,您不想将图像存储在 Core Data 中。

如果您同时发出所有请求,任何请求都会影响性能。您应该将并发网络操作限制为 ~ 4 或 5。

这是正确的实现吗?我是否应该在 CoreData 中也缓存图像而不使用 AFNetworking api?

见上文。

稍微偏离但相关的主题 - 我计划从服务器获取数百个项目,每个项目也可以有很多项目。并且这些中的每一个也将具有图像。所以它是一个非常重的网络应用程序。是否有任何最佳实践来管理这些请求的限制以避免性能问题?

见上文。在RKObjectManageroperationQueue 上设置并发计数。

【讨论】:

感谢您的回复。将图像保存在光盘上很有意义 - 我将使用 SDWebImage。将在操作队列对象上使用 setMaxConcurrentOperationCount 为 5。 我花了整个下午试图让 SDWebImage 工作,但它似乎不太稳定。请参阅此 [链接] (github.com/rs/SDWebImage/issues/138) 和 this - 我有同样的问题。图像不会随机显示。还有其他选择吗? 我个人使用了一个稍微修改过的github.com/markofjohnson/HJCache(但是项目本身有点过时了)。 SDWebImage 是常用选项。在 github 上搜索流行的替代品。【参考方案2】:

我没有很多 RestKit 知识,但我使用了很多 API,我只是 AFNetworking 和 JSON 解析器,并在 NSDictionery 中处理它。根据我的说法,图像缓存问题的最佳解决方案是SDWebImages 库。它简单且单独工作,它将处理所有缓存问题。和你的问题 4. 使用 AFNetworking requestManager 并且不要在主线程上处理你的数据(我认为 RestKit 和/或 AFNetworking)会处理这个问题,并且实现 SDWebImages 很简单

#import "SDWebImage/UIImageView+WebCache.h"
[userImage setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/12345/picture?type=large"]]
              placeholderImage:[UIImage imageNamed:@"unknownUser.png"]];

【讨论】:

以上是关于UIImageView+AFNetworking setImageWithURLRequest 使用 RestKit?的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView+Afnetworking 无法正常工作

AFNetworking 和 UIImageView 更新线程问题

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

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

使用 AFNetworking setImageWithURL 设置 UIImageView 圆角:

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