SDDownloadManager
一个简单的、健壮的 iOS (Swift 4) 下载管理器,基于 URLSession
,用于处理异步下载和管理多个文件。
由于没有使用 Swift 和基于新 URLSession
API 的开源项目,所以产生了编写另一个下载管理器库的想法。
SDDownloadManager
利用 URLSession
和 URLSessionDownloadTask
的强大功能,使得文件的下载和进度跟踪变得轻而易举。最初受到 TWRDownloadManager (https://github.com/chasseurmic/TWRDownloadManager) 的启发
安装库
要使用此库,只需将依赖项添加到 Podfile
中
platform :ios
pod 'SDDownloadManager'
运行 pod install
以安装依赖项。
用法
SDDownloadManager
提供以下任务的 API
- 将多个文件异步下载到指定目录。
- 使用闭包语法跟踪下载进度和完成,无需实现代理!
下载文件
public func dowloadFile(withRequest request: URLRequest,
inDirectory directory: String? = nil,
withName fileName: String? = nil,
onProgress progressBlock:DownloadProgressBlock? = nil,
onCompletion completionBlock:@escaping DownloadCompletionBlock) -> String?
参数
-
request
: 代表可下载资源的URLRequest
对象。 -
directory
: 代表应用缓存目录中的子目录名称。
下载的所有文件将是从设备的 /tmp
目录移至缓存目录。这样做有两个原因:
/tmp
目录可以偶尔清理,以确保任何部分下载、取消或失败的下载都能被适当处理,并且不会占用设备和iTunes备份的空间。- 默认情况下,缓存的目录不与用户iCloud文档同步。这是遵守苹果关于内容的规定,这些内容不是针对特定用户的,因此可以从互联网重新下载,并且不应与iCloud同步。
如果提供了目录名,则将在缓存目录中创建一个新子目录。
-
fileName
: 一旦文件下载完成,如果用户提供了fileName
,则将使用该名称将文件存储在最终目的地。如果没有提供名称,则管理器将使用响应参数中提供的建议文件名称或URL字符串的最后一个路径分量(例如,对于http://www.example.com/files/my_image.jpg
,最终的文件名将是my_image.jpg
)。 -
progressBlock
: 当下载进度更新时,回调一个从0到1.0的CGFloat
值。 -
completionBlock
: 回调两个参数error
和fileUrl
。- 如果下载成功,
fileUrl
代表文件的URL。可以通过此URL访问文件。 - 如果下载失败,
error
代表在下载过程中发生的错误。
- 如果下载成功,
返回
- 此方法返回一个与该下载调用唯一的密钥。理想情况下,键可以稍后用于取消下载或修改特定下载的进度块。如果已存在与指定的urlrequest相同的下载,此方法将返回
nil
。
检查当前下载
要检查文件是否正在下载,您可以使用以下方法之一
public func isDownloadInProgress(forKey key:String?) -> Bool
获取所有正在进行的下载
public func currentDownloads() -> [String]
修改正在进行的下载的块
public func alterBlocksForOngoingDownload(withUniqueKey key:String?,
setProgress progressBlock:DownloadProgressBlock?,
setCompletion completionBlock:@escaping DownloadCompletionBlock)
取消下载
取消所有下载
public func cancelAllDownloads()
取消特定下载
public func cancelDownload(forUniqueKey key:String?)
要求
SDDownloadManager
需要 iOS 9.x 或更高版本。
未来增强
我计划在未来的版本中整合以下功能
- 后台下载。
- 可恢复下载。
- 一个更好的、整洁的示例项目,包含更多的演示。(如果那些真正在使用它的那些人能提供一些帮助就太好了!)
许可证
使用受MIT 许可证管理。有关详细信息,请参阅 LICENSE。
贡献
欢迎所有贡献。请fork项目以添加功能,并通过提交pull request在下一版本中合并它们。