我的应用程序中有一个tableview,如下所示:
我需要的是当用户点击心脏图像,请求进入服务器以改变该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.
答案 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个请求。