MVDownloader
MVDownloader 是一个用于从网络异步远程请求下载图片或 JSON 格式文件的本地 Swift 库。
特性
- 异步图片下载和缓存。
- 支持并行远程请求和缓存 URL 响应
- 可取消下载并重新使用先前的请求中的 resume 数据
- 从缓存中获取图片以提高性能和体验
- 设置图片时内置过渡动画
- 支持图片占位符
- 保证相同的 URL 请求不会多次触发
- 自定义缓存控制和配置
- 保证无效的 URL 不会被触发
- 保证主线程不会被阻塞
- 扩展 UIImageView 并公开可用的方法,支持快速下载图片
- 多个资源访问同一资源将备份相同的响应
- 支持从 JSON 对象解码数据类型实例
- 底层使用 GRC
示例
要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
。
要求
- iOS 10.0+
- Xcode 10.0+
- Swift 5.0+
依赖项
安装
MVDownloader可通过CocoaPods使用。要安装它,只需将以下行添加到Podfile中
platform :ios, '10.0'
use_frameworks!
pod 'MVDownloader'
使用说明
共享实例
MVDownloader有一个共享实例,可用于访问所有公开的API方法。
import MVDownloader
MVDownloader.shared
默认情况下,库将缓存所有给定URL请求的响应,并使用NSCache
对象提供高达80 mb
的内存空间。您可以通过使用定义的缓存初始化MVDownloader.init(urlCache:_)
来配置具有不同存储容量的自定义NSCache
对象。
下载图片
使用库下载图片可以像提供适当的URL
请求到requestImage(from:_, comepletion:_)
方法一样简单,并接管下载和将响应数据转换为MVImage
(一种UIImage
类型)的过程。
import MVDownloader
let url = URL(string:"https://techcrunch.com/wp-content/uploads/2015/04/codecode.jpg?w=1390&crop=1")!
MVDownloader.shared.requestImage(from: url) { (mvimage, error) in
if let downloadedImage = mvimage {
print("Downloaded image: ", downloadedImage)
}
}
此外,还有一个简单的方法快速下载图片,而无需编写较长的代码块。查看mv_setImage
示例。
mv_setImage
下载图片
使用MVDownloader库在底层扩展了UIImageView
,并公开了mv_setUmage(from:_)
方法,旨在自动下载图片并应用动画过渡。
import MVDownloader
guard let url = URL(string:"https://techcrunch.com/wp-content/uploads/2015/04/codecode.jpg?w=1390&crop=1") else {
print("Given url is invalid")
return
}
let imageView = UIImageView()
// Downloads image and sets it automatically
imageView.mv_setImage(from: url) { (error) in
...
}
下载JSON
可以从JSON对象中平滑地解码特定类型的实例,通过利用requestDecodable(type:_,from:)
方法执行。
import MVDownloader
/// A type that can convert itself into and out of an external representation.
public struct PhotoModel: Codable {
var urls: PhotoUrls
}
public struct PhotoUrls: Codable {
var raw: String
var full: String
var regular: String
var small: String
var thumb: String
}
guard let pasteBinUrl =
URL(string:"https://images.unsplash.com/photo-1464550883968-cec281c19761?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&w=400&fit=max&s=d5682032c546a3520465f2965cde1cec") else {
print("Given url is invalid")
return
}
/// By default, below function utilises `JSONDecoder` object to decode instances of a data type from JSON objects.
MVDownloader.shared.requestDecodable(type: [PhotoModel].self, from: pasteBinUrl) { (data, error) in
...
// Proceed with data extraction
...
}
正常远程请求
此库的另一好处是,它不仅限于下载JSON和图片。您还可以继续发出正常的网络请求。
import MVDownloader
let url = URL(string: "www.google.com")!
let urlRequest = URLRequest(url: url)
MVDownloader.shared.request(urlRequest) { (data, error) in
...
// Process response data
...
}
取消活动请求
活动远程请求可以取消并从活动下载任务集合列表中完全删除。
import MVDownloader
let url = URL(string: "www.google.com")!
let urlRequest = URLRequest(url: url)
let downloader = MVDownloader.shared
// Active request on progress
downloader.request(urlRequest) { (data, error) in
...
// Proceed with data extraction
...
}
// Cancelling active request using there associated `URL` request
let requestDidCancel = downloader.cancelRequest(for: url)
// Check if request is successfully cancelled
if requestDidCancel {
...
}
清除缓存
可以通过简单地调用以下方法clearAllCache()
,轻松清除整个缓存。
MVDownloader.shared.clearAllCache()
可以通过以下方法清除缓存中的特定请求:
guard let url = URL(string:"https://techcrunch.com/wp-content/uploads/2015/04/codecode.jpg?w=1390&crop=1") else {
print("Given url is invalid")
return
}
MVDownloader.shared.clearCache(for: url)
作者
Manase Michael, [email protected]
许可
MVDownloader 在 MIT 许可下可用。更多信息请参阅 LICENSE 文件。