【问题标题】:To cancle any api request Using Alamofire in swift在 swift 中使用 Alamofire 取消 api 请求
【发布时间】: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

标签: swift alamofire


【解决方案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 来实现

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2017-09-02
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多