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) )