私たちのアプリケーションはほとんどが C++ で書かれており、そのコアは複数のプラットフォーム (Win、Mac、Android、iOS) で共有される静的ライブラリです。
iOS のサポートを追加し、サーバーとのすべての HTTP get/post 通信を実行する libcurl を使用する一連の機能を備えています。
しかし、iOS では、NSURLSession を使用してこれらの呼び出しを実装しています。
私の質問は非常に単純です.NSURLSessionDataTaskにC++のcompletionHandlerを提供するコードはどのように見えますか?
おそらく私はこれについて間違った方法で考えていますが、それは私が質問をするために考えることができる最も明確です.
世界のサンプルコードを使用して、次のことを試しましたが、役に立ちませんでした。完了ハンドラ内の 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());