使用lambda的异步请求/响应

时间:2016-04-05 14:23:16

标签: c++ objective-c asynchronous lambda objective-c++

我试图找出一个简单的异步请求/回调模式的C ++语法。

我有Objective-C代码,如下所示:

NSString *arg0 = @"set.x"; // a string on the heap
NSArray *args = @[arg0];

[Request requestWithArgs:args onCompletion:^(NSDictionary *response, NSError *error)
{
    if(error)
    {
        // deal with it
    }
    else
    {
        id obj = response[arg0];
        // do things with the response
    }
}];

请求在completionHandler之前返回,而completionHandler块捕获对局部变量(arg0)的引用。 在幕后,Request类将提供的匿名completionHandler添加到队列中,并在请求完成时调用它。

我在C ++中使用lambdas?只是不确定语法。如何将所有权保留或转移到传递的变量,以便在调用completionHandler时它们仍然存在?我想如果不应该将对象复制到堆上,那么传递给lambda的任何对象都需要在堆上分配?

响应字典和错误是在请求中创建的,还需要传递给completionHandler。我该如何正确地做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:0)

Lambdas是关闭的。创建lambda时在范围内的任何变量都可以通过值或引用来捕获。我不是Objective-C程序员,但我猜你在C ++中的功能大致相当于:

  auto onCompletion = [&arg0](NSDictionary *response, NSError *error) { 
     // function body goes here
  }

该代码定义了一个函数对象,它通过引用捕获arg0,接受两个参数,并且不返回任何内容。它将该函数对象分配给一个名为OnCompletion的变量。

通过引用捕获确实需要捕获的变量的生命周期至少与lambda生成的函数对象一样长。如果情况并非如此,则省略&在arg0之前,它将被值捕获。

如果需要定义带返回值的lambda,则返回类型在参数列表之后定义,前面是箭头操作符。如果它定义了一个返回int的函数,那么上面的lambda会是什么样子:

  auto onCompletion = [&arg0](NSDictionary *response, NSError *error) -> int { 
     // function body goes here
  }