如何检查我的请求已发送的Alamofire?

时间:2018-10-08 09:50:22

标签: ios swift alamofire

使用Alamofire可以在发送请求时收到事件,无论是否收到响应?就像下面的URLSession方法一样:

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                            didSendBodyData:(int64_t)bytesSent
                             totalBytesSent:(int64_t)totalBytesSent
                   totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;

编辑: 我的代码是将JSON发送到服务器:

Alamofire.request("http://...", method: HTTPMethod.post, parameters: params, encoding: JSONEncoding.default,
                      headers: [...]).responseJSON {
                                    response in
                                    if response.result.isSuccess {
                                        print("result is Success")
                                    } else {
                                        print("result is Failure")
                                    }
    }

我想处理如果网络断开并且我想知道响应是否到达的处理方法。

在此先感谢您提供的帮助。

2 个答案:

答案 0 :(得分:2)

响应验证

默认情况下,无论响应内容如何,​​Alamofire都会将任何已完成的请求视为成功。如果响应的状态码或MIME类型不可接受,则在响应处理程序之前调用validate会导致生成错误。

手动验证

Alamofire.request("https://httpbin.org/get")
    .validate(statusCode: 200..<300)
    .validate(contentType: ["application/json"])
    .responseData { response in
        switch response.result {
        case .success:
            print("Validation Successful")
        case .failure(let error):
            print(error)
        }
    }

自动验证

自动验证200..<300范围内的状态代码,并且响应的Content-Type标头与请求的Accept标头(如果提供了标头)相匹配。

Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in
    switch response.result {
    case .success:
        print("Validation Successful")
    case .failure(let error):
        print(error)
    }
}

统计指标

时间轴 Alamofire收集Request整个生命周期中的计时,并创建一个Timeline对象,该对象公开为所有响应类型的属性。

Alamofire.request("https://httpbin.org/get").responseJSON { response in
    print(response.timeline)
}

以上报告了以下Timeline信息:

  • Latency:0.428秒
  • Request Duration:0.428秒
  • Serialization Duration:0.001秒
  • Total Duration:0.429秒

取自Alamofire Usage。你可以看得更深。

答案 1 :(得分:1)

您可以只使用标准闭包,它会给您答复。无论响应是否为错误,都将调用此关闭。如果您想查看上传进度,也可以这样做

Alamofire.download("https://httpbin.org/image/png")
    .downloadProgress { progress in // progress
        print("Download Progress: \(progress.fractionCompleted)")
    }
    .responseData { response in // usual place to get response
        if let data = response.result.value {
            let image = UIImage(data: data)
        }
    }

已阅读Making a request documentation以获得更多信息