在 swift 中使用 Alamofire 取消 api 请求
Posted
技术标签:
【中文标题】在 swift 中使用 Alamofire 取消 api 请求【英文标题】:To cancle any api request Using Alamofire in swift 【发布时间】:2021-03-11 18:04:18 【问题描述】:我在 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)
【问题讨论】:
你大概可以使用Operation和OperationQueu 【参考方案1】: 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 中的用法 step1 声明:var loginDataRequest: DataRequest?
step2:在函数调用中初始化数据请求
第三步:动作事件取消这个请求 loginDataRequest.cancel
另一种方法 可以通过 dispatch work Item 或者 operation Queue 来实现
【讨论】:
以上是关于在 swift 中使用 Alamofire 取消 api 请求的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3.0 Alamofire 4.0 - Domain=NSURLErrorDomain Code=-999 “取消”
Alamofire 在 Swift 3、Xcode 8 中出现错误
使用 swift 在 Alamofire 中使用 CURL 命令