AFnetworking Vs dispatch_aync() Vs SDWebImage 框架
Posted
技术标签:
【中文标题】AFnetworking Vs dispatch_aync() Vs SDWebImage 框架【英文标题】:AFnetworking Vs dispatch_aync() Vs SDWebImage Framework 【发布时间】:2014-01-27 10:05:14 【问题描述】:我是 ios 编程新手。
我有一个要求,我必须多次进行服务器调用,提供大型 JSON,然后解析并显示在 TableView
/Collection
/View
Controllers
。
我必须在Collection Grid View
和UITableView
中下载图片,从而在用户滚动时开始/取消图片的下载。
所以
Q1)对于表格视图/网格视图中的图像下载,我正在考虑使用 Apple Table Lazy Loading Sample + 用 SDWebImage
替换图标下载器,如链接中提到的 Apple 示例中的几个问题和通过 SDWebImage
我可以根据我的要求配置cache
。
编辑: 基本上我希望有一种非常透明的方式从 url 获取图像,所以首先在 NSCache 中查找它们,如果在磁盘(或核心数据)上找不到查找如果找不到,请再次下载异步,然后再次保存在缓存中。我猜 SDWebImage 提供了这个,但对于 AFNetworking,我必须查看内部代码并修改它。
iOS lazy-loading of table images
Q2) 对于服务器调用和JSON
解析,我是否应该使用dispatch_async
然后使用NSJSONSerialization
解析JSON
或者我应该使用AFNetworking
来解决这个问题
使用AFNetworking
lib 的缺点是我只需要服务器调用并且不需要解析其他功能..因此,如果我要使用这个 lib,这将使应用程序大小增加 1.4 MB,因为我已经添加了 @ 987654337@ 框架 (>3 MB)。
这是我在谷歌搜索后发现的。 请建议我是否遗漏了什么......以及我应该遵循的任何其他方法。
【问题讨论】:
【参考方案1】:AFNetworking
更好,可以处理您的这两个问题。您还可以将其用于解析和图像下载。如果图像视图请求相同的图像,它甚至可以缓存并且永远不会一次又一次地访问服务器。使用AFNetworking
中提供的UImageView
类别。
编辑
在 Afnetworking 中缓存阅读 this 提交的帖子。
如果您不想使用 AFNetworking 的全部功能而只想下载数据,我建议您不要使用它,您可以使用 NSURSession
完成所有操作,不要在项目中添加依赖项。使用NSURLSession
它的强大可以为您做得更好。您只需要一个NSJSONSerilization
调用即可将数据解析为NSObject
,这没什么大不了的。
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error)
// ...
];
[task resume];
【讨论】:
非常感谢您提供此信息。但我怀疑我们能否按照我们的要求在 AFNetworking 中配置缓存? 您有什么要求...您甚至可以扩展它,将缓存移动到磁盘或您想做的任何更改... github.com/AFNetworking/AFNetworking/pull/1136阅读这个链接你会发现一些有趣的缓存讨论。 感谢 C_X 的信息,但我决定通过关注此***.com/questions/8703877/… 选择 SDWebImage。你能看看这个吗?谢谢 SDWebImage 也是非常好的 API,您将包含更多的依赖项.. 否则很好。现在,如果您没有使用完整的 AFNetworking 功能,为什么不开始使用 NSURLSession 下载 JSON 数据,这也是一种选择。以上是关于AFnetworking Vs dispatch_aync() Vs SDWebImage 框架的主要内容,如果未能解决你的问题,请参考以下文章
ASIHTTPRequest vs AFNetworking vs NSUrlRequest
restkit vs afnetworking vs mknetworkkit vs nsurlconnection有啥区别[关闭]
Application.Current.Dispatcher.BeginInvoke(action) VS。 Application.Current.Dispatcher.Invoke(action)