Design patterns 模式:使用gcd快速回调
我有一个异步函数,它必须在自己的私有队列上向调用方报告。我没有在我的函数定义中添加几个队列和闭包,而是想使用一个封装结构 因此:Design patterns 模式:使用gcd快速回调,design-patterns,swift,callback,grand-central-dispatch,Design Patterns,Swift,Callback,Grand Central Dispatch,我有一个异步函数,它必须在自己的私有队列上向调用方报告。我没有在我的函数定义中添加几个队列和闭包,而是想使用一个封装结构 因此: func doStuff(input : String, progressQeue : dispatch_queue_t, completionQueue :dispatch_queue_t, progress : ()->(), completion : ()->()) 变成这样: func doStuff(input : String, dispat
func doStuff(input : String, progressQeue : dispatch_queue_t, completionQueue :dispatch_queue_t, progress : ()->(), completion : ()->())
变成这样:
func doStuff(input : String, dispatch : Dispatch?)
与:
但我不知道如何将这些参数传递给结构中的completion函数。如果泛型CompletionType接受参数,则可变参数可以工作
func complete_async(parameters : AnyObject...)
{
dispatch_async(completionQueue) {
completion( ??? )
}
}
如果你对这种方法有任何反馈,那就太好了
编辑:
我刚刚意识到,回调结束将始终有一个无效的回报:
(...) -> ()
因此,这成为可能:
struct Dispatch< CompletionType > {
var function : (CompletionType -> ())?
init()
{
}
func complete_async(parameters : T)
{
dispatch_async(completionQueue) {
completion(parameters)
}
}
}
这里唯一的限制是CompletionType是一个元组,例如:String,Double我在编辑中遗漏了一些变量和函数,但是,将其与预编辑代码结合起来很容易。我认为,如果让调用站点定义在何处执行实际处理程序(例如,使用dispatch_async和friends),只需将两个闭包传递给doStuff函数,该函数将在其选择的私有队列上调用,则可以大大简化问题。
func complete_async(parameters : AnyObject...)
{
dispatch_async(completionQueue) {
completion( ??? )
}
}
(...) -> ()
struct Dispatch< CompletionType > {
var function : (CompletionType -> ())?
init()
{
}
func complete_async(parameters : T)
{
dispatch_async(completionQueue) {
completion(parameters)
}
}
}
dispatch?.complete_async( ("pi", 3.14) )