Alamofire POST请求有进展

时间:2015-02-01 20:58:58

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

我正在使用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)
        }

但是,我注意到只有在post请求结束后才会调用 .progress块,而不是多次调用以实际跟踪进度。                  println(“ENTER .PROGRESSS”)只被调用一次(最后)

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

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

3 个答案:

答案 0 :(得分:6)

您可以做的是首先使用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最初在上述评论中提到的那样,肯定会有进展更新。

答案 1 :(得分:1)

正如 @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
         })

注意您必须将 &#34;内容类型&#34; http标头字段值设置为 &#34; application / json&#34; 如果数据格式化为json,则在后端正确解码。

答案 2 :(得分:0)

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

他们有子部分

  1. 按进度上传
  2. 上传MultipartFormData
  3. 其中介绍了上传。