【问题标题】:Alamofire POST request with progress带有进度的 Alamofire POST 请求
【发布时间】:2015-03-31 19:29:27
【问题描述】:

我正在使用 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 块 仅在发布请求结束后才被调用,而不是被多次调用以实际跟踪进度。 println("ENTER .PROGRESSS") 只被调用一次(在最后)

如何使 .progress 与 Alamofire.request POST 一起使用?

另外:我的参数包括一个 base64 编码的图像字符串。我正在使用后端 Ruby on Rails 来处理图像。这个过程需要相当长的时间。

【问题讨论】:

  • 如果您返回的只是 JSON,很可能是整个有效负载都同时返回了......究竟打印了什么?
  • 哦,是的,在它返回后,我确实收到了一个简单的 JSON 请求。问题是我的参数包括一个 base64 编码的图像。我正在使用后端 Rails 来处理上传的图像,这个过程需要一些时间。
  • 除非你在做upload,否则报告的进度就是下载进度。
  • 您能告诉我进行 .upload(传递 NSData 图像)还是使用 base64 编码的图像字符串进行简单的 .POST 请求之间的区别?

标签: ios ruby-on-rails xcode swift alamofire


【解决方案1】:

您可以做的是首先使用ParameterEncoding 枚举来生成 HTTPBody 数据。然后,您可以提取该数据并将其传递给 Alamofire upload 方法。这是您在 Playground 中编译的相同函数的修改版本,而是使用 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 最初在他上面的评论中提到的那样,这肯定会有进度更新。

【讨论】:

  • 如何使用.upload在后端检索参数?我使用 Rails 作为后端,我使用 .request 检索的所有参数现在都使用 .upload 为零。
  • 您可能需要在上传之前将数据打包为 MultipartFormData 对象。在 Alamofire 支持 MultipartFormData 上传之前,您需要使用 AFNetworking。您还可以在 URL 中传递参数,并在 HTTPBody 中传递数据。这取决于您的服务器的期望。
  • 嗨@fabdarice,如果这个答案帮助你解决了你的问题,你能把它标记为一个好的社区用户吗?干杯。
  • 这个上传超载还存在吗?
【解决方案2】:

正如 @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 以便在后端正确解码。

【讨论】:

    【解决方案3】:

    Alamofire 中有一个单独的上传方法。请查看他们的文档here

    他们有子部分

    1. 上传进度
    2. 上传 MultipartFormData

    其中描述了上传。

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2016-02-22
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      相关资源
      最近更新 更多