我想构建一个管理器工具,当给定一个与参数列表匹配的元组时,它可以执行一组相同类型的闭包,但是我在修改Swift的类型系统时遇到了麻烦。
一般的想法是,我希望能够从任何类请求资源(带有完成块),并且只需要一次请求资源,并在获得响应时调用每个完成块。我已经将它原型化了一次并且效果很好,看起来像这样:
class ResourceGetter {
var completionQueue: [((Resource) -> Void)]?
func getResource(withCompletion completion:((Resource) -> Void)) {
guard completionQueue == nil else {
completionQueue!.append(completion)
return
}
ClassThatActuallyGetsIt.getResource(completion: { (res: Resource) -> Void in
completionQueue.forEach { $0(res) }
completionQueue = nil
}
}
}
并且任何类都可以调用ResourceGetter.getResource,并且当资源实际可用时将处理它们的闭包。
现在我想在应用程序的几个不同位置使用此功能,但我不想在completionQueue中为可能需要的每个资源编写,所以我想弄清楚如何通用化(我不知道是否有这个词)这个功能。
我的梦想是看它并像这样使用:
class CompletionHolder {
var completionDict: [String : [((ArbitraryTuple) -> Void)]] = [:]
func execClosures(forKey key: String, parameters: ArbitraryTuple) {
completionDict[key].forEach { $0(parameters) }
}
}
class ResourceGetter {
func getResource(withCompletion completion:((Resource) -> Void)) {
CompletionHolder.completionDict["Resource"].append(completion)
ClassThatActuallyGetsIt.getResource(completion: { (res: Resource) -> Void in
CompletionHolder.execClosures(forKey: "Resource", parameters: (Resource))
}
}
}
我怎样才能实现这一目标?