取消网址请求以避免多次API调用

时间:2019-04-03 04:02:45

标签: ios swift alamofire

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

在此,控件每次到达for-each部分并退出。它不会进去。

编辑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 }
…

1 个答案:

答案 0 :(得分: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进行搜索时执行此操作。