阅读 1568

Swift - Alamofire与Cache封装实现网络缓存、下载

  • AlamofireCache的封装实现对网络数据的缓存,可以存储JSON、String、Data,接口简单明了.
  • 封装Alamofire下载,使用更方便.
  • 如有问题,欢迎提出,不足之处,欢迎纠正,欢迎star ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
  • Github: github.com/MQZHot/Dais…
    缓存.gif
    缓存.gif

下载.gif
下载.gif

1. 请求+缓存

  • 缓存数据只需要调用.cache(true),不调用或者.cache(false)则不缓存
  • 调用responseCacheAndString可以先读取缓存数据,再读取网络数据
  • 通过isCacheData属性可以区分缓存数据还是网络数据

    DaisyNet.request(url, params: params).cache(true).responseCacheAndJson { value in
      switch value.result {
      case .success(let json):
          if value.isCacheData {
              print("我是缓存的")
          } else {
              print("我是网络的")
          }
      case .failure(let error):
          print(error)
      }
    }复制代码
  • 你也可以分别读取缓存数据和网络数据,如下代码

  • 调用cacheJson方法获取缓存数据,调用responseJson获取网络数据
DaisyNet.request(url, params: params).cache(true).cacheJson { json in
        print("我是缓存的")
    }.responseJson { response in
    print("我是网络的")
}复制代码
  • 如果你不需要缓存,可以直接调用responseJson方法

    DaisyNet.request(url).responseString { response in
      switch response {
      case .success(let value): print(value)
      case .failure(let error): print(error)
      }
    }复制代码
  • 同理,如果你要缓存Data或者String,与JSON是相似的

    /// 先读取缓存,再读取网络数据
    DaisyNet.request(url).cache(true).responseCacheAndString { value in }
    DaisyNet.request(url).cache(true).responseCacheAndData { value in }复制代码
    /// 分别获取缓存和网络数据
    DaisyNet.request(url).cache(true).cacheString { string in
          print("我是缓存的")
      }.responseString { response in
      print("我是网络的")
    }复制代码
  • 取消请求

    DaisyNet.cancel(url, params: params)复制代码
  • 清除缓存

    /// 清除所有缓存
    func removeAllCache(completion: @escaping (Bool)->())
    /// 根据url和params清除缓存
    func removeObjectCache(_ url: String, params: [String: Any]? = nil, completion: @escaping (Bool)->())复制代码

2. 下载

思路:

  • 1.下载中的任务,用url作为key添加到DownloadManager单例中
  • 2.取消任务、删除任务以及下载失败时,将下载任务从单例中删除,保证- DownloadManager单例的downloadTasks中是正在下载的
  • 3.暂停下载,保存已经下载的data到plist文件
    DaisyNet.download(url).downloadProgress { progress in
          /// 下载进度
      }.response { response in
      /// 下载完成
    }复制代码
  • 如果正在下载中退出当前界面,再次进入时可以通过以下方法获取下载进度,并改变UI
    DaisyNet.downloadProgress(url) {
          print($0)
      }?.response(completion: { _ in
      print("下载完成")
    })复制代码
  • 获取下载状态

    DaisyNet.downloadStatus(url)复制代码
  • 获取下载百分比

    DaisyNet.downloadPercent(url)复制代码
  • 获取下载完成后文件所在位置

    DDaisyNet.downloadFilePath(url)复制代码
  • 删除某个下载

    DaisyNet.downloadDelete(url)复制代码
  • 取消某个下载

    DaisyNet.downloadCancel(url)复制代码
关注下面的标签,发现更多相似文章
评论