Alamofire POST 请求有进展
Alamofire POST request with progress
我正在使用 Alamofire 执行 POST 请求。
由于此 POST 请求可能需要一段时间,我想跟踪进度并将其显示为 ProgressView。
Alamofire.request(.POST, ApiLink.create_post, parameters: parameters, encoding: .JSON)
.progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) -> Void in
println("ENTER .PROGRESSS")
println("\(totalBytesRead) of \(totalBytesExpectedToRead)")
self.progressView.setProgress(Float(totalBytesRead) / Float(totalBytesExpectedToRead), animated: true)
}
.responseJSON { (_, _, mydata, _) in
println(mydata)
}
但是,我注意到 .progress 块 仅在 post 请求结束后才被调用,而不是被多次调用以实际跟踪进度。
println("ENTER .PROGRESSS") 只被调用一次(最后)
如何使 .progress 与 Alamofire.request POST 一起工作?
另外:我的参数包括一个 base64 编码的图像字符串。我在 Rails 上使用后端 Ruby 来处理图像。这个过程需要相当长的时间。
您可以做的是首先使用 ParameterEncoding
枚举生成 HTTPBody 数据。然后您可以提取该数据并将其传递给 Alamofire upload
方法。这是在操场上编译的同一函数的修改版本,而是使用 upload
函数。
struct ApiLink {
static let create_post = "/my/path/for/create/post"
}
let parameters: [String: AnyObject] = ["key": "value"] // Make sure this has your image as well
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: ApiLink.create_post)!)
mutableURLRequest.HTTPMethod = Method.POST.rawValue
let encodedURLRequest = ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
let data = encodedURLRequest.HTTPBody!
let progressView = UIProgressView()
Alamofire.upload(mutableURLRequest, data)
.progress { _, totalBytesRead, totalBytesExpectedToRead in
println("ENTER .PROGRESSS")
println("\(totalBytesRead) of \(totalBytesExpectedToRead)")
progressView.setProgress(Float(totalBytesRead) / Float(totalBytesExpectedToRead), animated: true)
}
.responseJSON { _, _, mydata, _ in
println(mydata)
}
正如@mattt 在他上面的评论中最初提到的那样,这肯定会有进展更新。
Alamofire 中有单独的上传方法。请查看他们的文档 here.
他们有小节
- 上传有进度
- 正在上传 MultipartFormData
其中描述了上传。
正如@cnoon所说,您可以使用上传方法来跟踪进度并进行一些修改。这是对我有用的东西:
let jsonData = NSJSONSerialization.dataWithJSONObject(jsonObject, options: .PrettyPrinted)
Alamofire.upload(.POST, "API URL String", headers: ["Content-Type": "application/json"], data: jsonData)
.validate()
.responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) in
//Completion handler code
})
.progress({ (bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) in
//Progress handler code
})
注意你必须设置"Content-Type" http头字段值到 "application/json" 如果数据格式为 json 以便在后端正确解码。
我正在使用 Alamofire 执行 POST 请求。 由于此 POST 请求可能需要一段时间,我想跟踪进度并将其显示为 ProgressView。
Alamofire.request(.POST, ApiLink.create_post, parameters: parameters, encoding: .JSON)
.progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) -> Void in
println("ENTER .PROGRESSS")
println("\(totalBytesRead) of \(totalBytesExpectedToRead)")
self.progressView.setProgress(Float(totalBytesRead) / Float(totalBytesExpectedToRead), animated: true)
}
.responseJSON { (_, _, mydata, _) in
println(mydata)
}
但是,我注意到 .progress 块 仅在 post 请求结束后才被调用,而不是被多次调用以实际跟踪进度。 println("ENTER .PROGRESSS") 只被调用一次(最后)
如何使 .progress 与 Alamofire.request POST 一起工作?
另外:我的参数包括一个 base64 编码的图像字符串。我在 Rails 上使用后端 Ruby 来处理图像。这个过程需要相当长的时间。
您可以做的是首先使用 ParameterEncoding
枚举生成 HTTPBody 数据。然后您可以提取该数据并将其传递给 Alamofire upload
方法。这是在操场上编译的同一函数的修改版本,而是使用 upload
函数。
struct ApiLink {
static let create_post = "/my/path/for/create/post"
}
let parameters: [String: AnyObject] = ["key": "value"] // Make sure this has your image as well
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: ApiLink.create_post)!)
mutableURLRequest.HTTPMethod = Method.POST.rawValue
let encodedURLRequest = ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
let data = encodedURLRequest.HTTPBody!
let progressView = UIProgressView()
Alamofire.upload(mutableURLRequest, data)
.progress { _, totalBytesRead, totalBytesExpectedToRead in
println("ENTER .PROGRESSS")
println("\(totalBytesRead) of \(totalBytesExpectedToRead)")
progressView.setProgress(Float(totalBytesRead) / Float(totalBytesExpectedToRead), animated: true)
}
.responseJSON { _, _, mydata, _ in
println(mydata)
}
正如@mattt 在他上面的评论中最初提到的那样,这肯定会有进展更新。
Alamofire 中有单独的上传方法。请查看他们的文档 here.
他们有小节
- 上传有进度
- 正在上传 MultipartFormData
其中描述了上传。
正如@cnoon所说,您可以使用上传方法来跟踪进度并进行一些修改。这是对我有用的东西:
let jsonData = NSJSONSerialization.dataWithJSONObject(jsonObject, options: .PrettyPrinted)
Alamofire.upload(.POST, "API URL String", headers: ["Content-Type": "application/json"], data: jsonData)
.validate()
.responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) in
//Completion handler code
})
.progress({ (bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) in
//Progress handler code
})
注意你必须设置"Content-Type" http头字段值到 "application/json" 如果数据格式为 json 以便在后端正确解码。