取消网址请求以避免多个api调用

问题描述 投票:0回答:1

我在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()
          }
        }
      }
     }
   }
 }

在这里,每次控制到达每个部分并退出。它没有进去。

编辑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 }
…
ios swift alamofire
1个回答
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进行搜索时执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.