Я централизовал вызовы API для моего приложения в классе APIService
. Вызовы выглядят так, как показано ниже:
// GET: Attempts getconversations API call. Returns Array of Conversation objects or Error
func getConversations(searchString: String = "", completion: @escaping(Result<[Conversation], APIError>) -> Void) {
{...} //setting up URLRequest
let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, let _ = data
else {
print("ERROR: ", error ?? "unknown error")
completion(.failure(.responseError))
return
}
do {
{...} //define custom decoding strategy
}
let result = try decoder.decode(ResponseMultipleElements<[Conversation]>.self, from: data!)
completion(.success(result.detailresponse.element))
}catch {
completion(.failure(.decodingError))
}
}
dataTask.resume()
}
Я выполняю вызовы API из любой точки приложения: 1008 * за каждый введенный пользователем символ при вводе searchString
. Это было бы достаточно просто, просто позвонив по номеру func searchConversations
в зависимости от срабатывания UIPressesEvent
. Вот так:
override func pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
guard let key = presses.first?.key else { return }
switch key.keyCode {
{...} // handle special cases
default:
super.pressesEnded(presses, with: event)
searchConversations(searchString: SearchText.text)
}
}
Моя проблема заключается в следующем: Каждый раз, когда вводится новый символ, я бы хотел отменить предыдущий URLSession и запустить новый. Как я могу сделать это из обработчика UIPressesEvent
?