我的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()
}
}
}
}
}
}
在此,控件每次到达for-each部分并退出。它不会进去。
编辑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 }
…
答案 0 :(得分:0)
您可能只想调用从搜索启动的请求,而不是取消所有会话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进行搜索时执行此操作。