Alamofire DownloadRequest验证并从服务器获取响应数据

时间:2018-01-12 20:46:31

标签: ios swift alamofire

我有以下方法

fileprivate func performDownloadRequest(_ request: DownloadRequest) {
request
      .validate()
      .downloadProgress { (progress: Progress) in
        ...
      }
      .response { response in 
        ...

response'(DefaultDownloadResponse) -> Void'

如何将其设为'(DownloadResponse) -> Void'?请注意DefaultDownloadResponse vs DownloadResponse

我想要这个的原因是因为DownloadResponse

/// The result of response serialization.
public let result: Result<Value>

我希望检索服务器发送的JSON数据,以便为用户显示自定义文本。 DefaultDownloadResponse没有响应数据。

感谢任何见解。

1 个答案:

答案 0 :(得分:0)

从底线开始,如果您需要Result类型,则必须使用responseJSON。但是你不能用一个简单的DownloadRequest做到这一点。这提供了一些可能的选择:

  1. 如果您确实要使用下载请求,则在使用DownloadRequest参数创建to时,您已指定下载文件的目标位置,例如< / p>

    // you may have to create the directory if it hasn't been created yet
    
    try! FileManager.default.url(for: .downloadsDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    
    // then you can use it:
    
    let destination = DownloadRequest.suggestedDownloadDestination(for: .downloadsDirectory)
    let req = Alamofire.download("http://httpbin.org/get", to: destination)
    perform(download: req)
    

    然后:

    func perform(download request: DownloadRequest) {
        request
            .validate()
            .downloadProgress { progress in
                print(progress)
            }
            .responseJSON { response in
                switch response.result {
                case .success(let value): print(value)
                case .failure(let error): print(error)
                }
        }
    }
    

    如果您执行此操作,则可能需要在response.destinationURL完成后删除该文件。

  2. 恕我直言,下载任务的理论优势是峰值内存使用率较低。但是,如果您只是转而将该文件的内容加载到某个JSON对象中,我认为这会减少下载任务产生的任何优势。那么,问题是为什么不使用数据任务呢?你可以做一个DataRequest

    let req = Alamofire.request("http://httpbin.org/get")
    perform(get: req)
    

    然后:

    func perform(get request: DataRequest) {
        request
            .validate()
            .downloadProgress { progress in
                print(progress)
            }
            .responseJSON { response in
                switch response.result {
                case .success(let value): print(value)
                case .failure(let error): print(error)
                }
        }
    }
    
  3. 就个人而言,我倾向于使用数据任务而不是JSON的下载任务,除非您需要它(例如后台会话),但这取决于您。< / p>