使用 lambda 的异步请求/响应

asynchronous request / response using lambda

我正在尝试找出一个简单的异步 request/callback 模式的 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 之前的请求returns,completionHandler 块捕获对局部变量(arg0) 的引用。 在幕后,请求 class 将提供的匿名 completionHandler 添加到队列并在请求完成时调用它。

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

响应字典和错误是在请求内部创建的,也需要传递给completionHandler。我该如何正确执行此操作?

谢谢!

Lambda 是闭包。创建 lambda 时范围内的任何变量都可以按值或按引用捕获。我不是 Objective-C 程序员,但我猜你的函数在 C++ 中的粗略等效看起来像这样:

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

该代码定义了一个函数对象,它通过引用捕获 arg0,接受两个参数,return什么都没有。它将该函数对象分配给一个名为 OnCompletion 的变量。

通过引用捕获确实要求捕获的变量的生命周期至少与 lambda 生成的函数对象一样长。如果不是这种情况,则省略 arg0 之前的 &,它将改为按值捕获。

如果您需要定义具有 return 值的 lambda,则 return 类型定义在参数列表之后,前面是箭头运算符。如果上面的 lambda 定义了一个函数 returning 一个 int:

,它会是什么样子
  auto onCompletion = [&arg0](NSDictionary *response, NSError *error) -> int { 
     // function body goes here
  }