在swift中使用Alamofire取消任何api请求



我在swift中使用alamofire调用api。这是一个搜索api,当我在搜索栏中搜索任何文本时,我调用的是该api。我在延迟0.75秒后调用api。当有新的请求时,我想取消以前的请求。但我不知道如何取消请求。有人能帮我吗?

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.reload(_:)), object: searchBar)
perform(#selector(self.reload(_:)), with: searchBar, afterDelay: 0.75)
}

@objc func reload(_ searchBar: UISearchBar) {

guard let query = searchBar.text, query.trimmingCharacters(in: .whitespaces) != "" else {
self.searchLcodeWithText("")

print("nothing to search")
return
}
self.searchLcodeWithText(query)

print(query)
}
private func searchLcodeWithText(_ newText: String){
//Show
startActivityIndicator()
apiService.searchlcode(searchText: newText) { [self] (lcodeData) in
allLcodeArray = []
//Hide
if let lcde = lcodeData{

if lcde.count > 0{

allLcodeArray.append(contentsOf: lcde)
stopActivityIndicator()
}

}
else{

}
stopActivityIndicator()
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}

import Foundation
import Alamofire
class ApiService{
func searchlcode(searchText: String, completion: @escaping searchLcodeTypeAliasCompletion){

guard let urlrequest = URL(string: SEARCH_URL) else {return}
var parameters = [String:Any]()
parameters.updateValue(searchText, forKey: "lcode_name")
Alamofire.request(urlrequest, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { [self] (response : DataResponse<Any>) in
if let error = response.result.error {
debugPrint(error.localizedDescription)
return
}else{

guard let data = response.data else { return completion(nil)}
let jsonDecoder = JSONDecoder()
do {

let searchUser = try jsonDecoder.decode(searchLcodeTypeAlias.self, from: data)
print(searchUser)
completion(searchUser)
} catch {
debugPrint(error)
completion(nil)
}
}
}

}
}
Return DataRequest in function  then you can cancel specific request. 
for Example. 

@discardableResult
func login(params: loginRequestModel, completion: @escaping (RequestResult<UserDataResponse, String>) -> Void) -> DataRequest {

params.printJson()
let url = baseUrl + endPoints.login.rawValue
let request = sessionManager.request(url,method: .post, parameters: params, headers: headers)

request.responseDecodable(of: UserDataResponse.self){ (response) in
completion(self.getValidResponse(response))
}


return request
}

viewController中的用法步骤1声明:var loginDataRequest:DataRequest?

步骤2:在函数调用中初始化数据请求

步骤3:操作事件取消此请求
loginDataRequest.cancel

另一种方法您可以通过使用调度工作项或操作队列来实现

相关内容

最新更新