我在UITableView
上面有一个搜索文本字段。当我在搜索字段上输入时,会调用api进行搜索。
现在,在这种情况下,为每个键入的字符调用api。为了避免这种情况并且在文本字段中对整个术语只调用一次api,我想取消之前的api请求。
这是我取消请求的代码..但它不起作用..出了什么问题......?
fileprivate func cancelRequest(_ url: URL) {
cancelRequestsOfURLs([url.absoluteString])
}
func cancelRequestsOfURLs (_ urlList: [String]) {
let sessionManager = Alamofire.SessionManager.default
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
// Cancel Data Tasks
dataTasks.forEach {
for url in urlList {
if ($0.originalRequest?.url?.lastPathComponent == url) {
print("Cancelling: \(String(describing: $0.originalRequest?.url?.absoluteString))")
$0.cancel()
}
}
}
}
}
}
在这里,每次控制到达每个部分并退出。它没有进去。
编辑1:api调用的顺序
这是我打电话给api的顺序......
1.WebServiceClient.shared.getGroupList(withParameters: param….
2. func getGroupList(withParameters param…. {
guard let url = APIClient.shared.createWebServiceUrl…..else {
return
}
sendRequest(toURL: url,
method: .post,
…
3. func sendRequest(toURL url :URL,
method: HTTPMethod,
….-> Void) {
let dataRequest = request(url, method: method, parameters: parameters, headers: headers)
if let request = dataRequest.request {
if (URLCache.shared.cachedResponse(for: request) != nil) {
URLCache.shared.removeCachedResponse(for: request)
}
}
dataRequest.validate(statusCode: 200..<300)
dataRequest.responseJSON() { [weak self] response in
guard let `self` = self else { return }
…
您可能只想调用从搜索启动的请求,而不是取消所有会话API请求。您的示例请求: -
var request: Request?
// In your search method
request = Alamofire.SessionManager.default.request(path!, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON { response in
switch response.result {
case .success(let data):
// Do something with response
case .failure(let error) :
// Do something with faliure
}
}
然后,您可以保留对此请求对象的引用并使用取消它
request?.cancel()
request = nil
// Call search api again
您可以在调用下一个API进行搜索时执行此操作。