使用 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
}
我正在尝试找出一个简单的异步 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
}