同时多次调用Alamofire,Swift中的API

时间:2017-12-07 05:28:24

标签: ios swift asynchronous alamofire

我的应用程序中有一个tableview,如下所示:

enter image description here

我需要的是当用户点击心脏图像,请求进入服务器以改变该tableview项目的状态,并且响应(成功或错误)应该返回。这是在点击时调用的代码:

var manager = Alamofire.SessionManager.default
manager = Alamofire.SessionManager(configuration: configuration)
manager.request(######, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON(completionHandler: { response in

                switch response.result {
                case .success:
                    print(response)

                    let responseJson = JSON(response.result.value!)

                    // parsing JSON response using swiftyJSON
                    let code = (responseJson["code"]).int
                    let successStatus = responseJson["success"]
                    let message = (responseJson["message"]).rawString()

                    if ((code == 200) && (successStatus == true))
                    {
                        success()
                    }
                    else if (successStatus == false)
                    {
                        let errorObj = CError()
                        if ((code == 401) || (code == 404) || (code == 409))
                        {
                            errorObj.message = message!
                            errorObj.code = code!
                            error(errorObj)
                        }

                        else if ((code == 400) || (code == 500))
                        {
                            let object = response.result.value as? [String:Any]
                            let responseErrors = object!["errors"] as? [String:Any]
                            errorObj.responseErrors = responseErrors
                            errorObj.message = message!
                            errorObj.code = code!
                            error(errorObj)
                        }
                        else
                        {
                            errorObj.message = "Error processing request"
                            errorObj.code = 500
                            error(errorObj)
                        }
                    }

                case .failure (let serverError):
                    let errorObj = CError()
                    if (serverError._code == NSURLErrorTimedOut)
                    {
                        errorObj.message = "Request timed out"
                    }
                    else
                    {
                        errorObj.message = "Error sending request to server"
                    }
                    errorObj.code = 500
                    error(errorObj)
                }
            }
            )

如果我只点按一个项目,一切顺利。但是,当我点击多个项目时,假设我已经点击了两个项目,则会调用代码的错误块:

case .failure (let serverError):
                        let errorObj = CError()
                        if (serverError._code == NSURLErrorTimedOut)
                        {
                            errorObj.message = "Request timed out"
                        }
                        else
                        {
                            errorObj.message = "Error sending request to server" //this line gets called
                        }
                        errorObj.code = 500
                        error(errorObj)
                    }

之后,一个项目的成功响应回来了。

我从目前的情况中了解到:

  • 对服务器的一次调用。
  • 它的反应没有回来,第二次电话就开始了。
  • 此调用阻止第一个请求,并调用其错误块。
  • 然后第二次调用需要时间来处理并且它的响应来了 返回(成功块被调用)

根据Alamofire的文件,它的电话是在后台处理的。但根据这个https://github.com/Alamofire/Alamofire/issues/1922,默认情况下的响应会在主线程上调用。我认为这就是为什么同时被阻止的问题。 为了在后台处理,我尝试了这种方法:

let queue = DispatchQueue(label: "favAdv", qos: .background, attributes: .concurrent)
manager.request(urlAdventureFavouriteStatus, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON(queue: queue) { response in .....

但这对我没有用。 有谁能建议我解决这个问题? 如果我的理解有任何问题,那么请更正它,因为我是iOS新手。

我正在使用Xcode 9.1,Swift 4,Alamofire 4.

1 个答案:

答案 0 :(得分:0)

我稍后通过添加:

解决了这个问题
awk 'function unix(str,    tmp) {
        tmp=substr(str,1,7)" 01 00 00 00"; gsub("-"," ",tmp);
        return strftime("%Y-%m-%d",mktime(tmp) - 1) }
     { print $14, unix($14) }' <file>

添加此项将能够同时发送10个请求。