【发布时间】:2020-04-11 02:03:15
【问题描述】:
我已将我的应用程序的 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)")
}
})
}
我现在想要实现的是对用户输入searchString时点击的每个字符执行func searchConversations。
这很容易,只需根据被解雇的UIPressesEvent 调用func searchConversations。像这样:
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 处理程序内部执行此操作?
【问题讨论】:
-
看看下面的答案:Link
-
次要的无关观察,但我们通常不会检查 200(例如
httpResponse.statusCode == 200,而是任何 2xx 代码(例如,200..<300 ~= httpResponse.statusCode)。任何 2xx 代码都被视为成功,而不仅仅是 200 . 或许考虑到你目前的网络服务,200 就足够了,但 2xx 是谨慎的。
标签: ios swift urlsession