我们的应用程序主要是用 C++ 编写的,其核心是多个平台(Win、Mac、Android、iOS)共享的静态库。
我们正在添加 iOS 支持,并有一系列使用 libcurl 的函数来执行与我们的服务器的所有 HTTP get/post 通信。
但是对于 iOS,我们现在使用 NSURLSession 来实现这些调用。
我的问题很简单,代码如何为 NSURLSessionDataTask 提供 C++ 完成处理程序?
也许我正在以错误的方式思考这个问题,但这是我能想到的最清楚的问题。
使用世界上的示例代码,我尝试了以下方法,但无济于事。完成处理程序中的 Objective-C++ 代码永远不会被调用。它返回到 C++ 代码并且永远不会返回。
这是目标 C++ 函数:
std::string get(std::string urlStr)
{
NSURLSession *defaultSession = [NSURLSession sharedSession];
NSURL * url = [NSURL URLWithString:[NSString stringWithUTF8String:urlStr.c_str()]];
__block std::string returnVal;
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil)
{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Data = %@",text);
returnVal = std::string([text UTF8String]);
}
}];
[dataTask resume];
return returnVal;
}
这就是我在 C++ 中调用该代码的方式:
response = get(url);
fprintf(stderr, "Data in C++: %s", response.c_str());