我搜索了多个类型,因此通用搜索方法有一个通用类型T,多个简单方法根据需要调用它指定类型.我想推迟搜索方法的开始(Combine中为debounce
),并且我想尽可能深地隐藏此代码.
我通常在我的项目中使用Deliverc/await API,只有在必要时才使用Combine.我没有使用Deliverc/await找到内置解决方案,所以我要使用Combine的debounce
.(请告诉我是否有不带Combine的更Clean 解决方案)
所以我必须从adminc/wait到Combine然后返回.这需要使用withCheckedContinuation
,这会丢失T并导致错误:
// simple generic specification using Event
func searchEvents(query: String) async -> [Event] {
await search(query: query)
}
// simple generic specification using Artist
func searchArtists(query: String) async -> [Artist] {
await search(query: query)
}
// debouncing layer between specifications and generic search
private func search<T>(query: String) async -> [T] where T: Codable, T: Identifiable {
await withCheckedContinuation { continuation in
Debouncer().debounce(query) { query in
Task {
// Generic parameter 'T' could not be inferred
let a = await self.performSearch(query: query) // <- error here
continuation.resume(returning: a)
}
}
}
}
// generic search function, details don't matter
private func performSearch<T>(query: String) async -> [T] where T: Codable, T: Identifiable {
...
}
// class performing simple debouncing
class Debouncer {
static var shared = Debouncer()
private var debounceSubscription: AnyCancellable?
func debounce(_ string: String, block: (String) -> ()) {
debounceSubscription?.cancel()
debounceSubscription = Just(string)
.debounce(for: .milliseconds(200), scheduler: DispatchQueue.global(qos: .background))
.sink { string in
block(string)
}
}
}
有没有一种优雅的方法可以让它自动理解类型,而无需将其作为参数传递(类型:T.类型,查询:字符串)?