Я централизованно вызываю 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 из любого места в приложении, например:
func searchConversations(searchString: String) {
self.apiService.getConversations(searchString: searchString, completion: {result in
switch result {
case .success(let conversations):
DispatchQueue.main.async {
{...} // do stuff
}
case .failure(let error):
print("An error occured \(error.localizedDescription)")
}
})
}
Чего я хотел бы добиться сейчас, так это выполнить func searchConversations
для каждого символа, нажатого пользователем при вводе 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)
}
}
Моя проблема сейчас заключается в следующем: всякий раз, когда вводится новый символ, я хотел бы отменить предыдущую сессию URL и запустить новую. Как я могу сделать это изнутри обработчика UIPressesEvent
?
httpResponse.statusCode == 200
, а скорее любой код 2xx (например,200..<300 ~= httpResponse.statusCode
). Успехом считается любой код 2xx, а не только 200. Возможно, учитывая ваш текущий веб-сервис, 200 достаточно, но 2xx разумно. - person Rob   schedule 10.04.2020