在 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 中出现错误

Alamofire 从多个请求中取消一个请求

使用 swift 在 Alamofire 中使用 CURL 命令

如何在 Swift / Alamofire 中使用 multipartFormData?

在 swift 中使用 alamofire 将参数作为原始数据发送