こんにちは、akiです。
この記事ではHttp通信処理の完了に同期して任意の処理を実行するやり方を説明します。
やり方は簡単でHttp通信のコールバックの中にカスタムイベントを発行する処理を記述するだけです。カスタムイベント発行先に任意の処理を記述してやりましょう。
■環境
XCode:8.2.1
Cocos2d-x:3.9
カスタムイベントについてはこちらの記事(内部リンク)を参照して下さい。
ソースコード
void sendHttpRequestAndExecEvent(){ auto r = new cocos2d::network::HttpRequest(); r->setUrl("リクエスト送信先のURL"); std::vector<std::string> h; h.push_back("Content-Type: application/json"); r->setHeaders(h); r->setRequestType(HttpRequest::Type::POST); // データの設定(json形式) std::string userId = "userId"; std::string password = "password"; std::string data = "[{\"userId\":\"" + userId + "\", \"password\":\"" + password + "\"}]"; const char* buffer = data.c_str(); r->setRequestData(buffer, strlen(buffer)); // コールバックの設定 r->setResponseCallback([this, eventId](cocos2d::network::HttpClient* client, cocos2d::network::HttpResponse* response){ if(response->isSucceed()){ // カスタムイベントの発行 auto event = EventCustom(eventId); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); return true; }else{ return false; } }); // データ送信 network::HttpClient::getInstance()->send(r); r->release(); }
その他ポイント
・Http通信中もクライアント側のメインループは動いているので、タップイベントなどを取得することができてしまう。
・ですので、通信中に操作させたくない場合はタップイベントを停止したり、モーダルレイヤなどを現在のレイヤの上にかぶせるなどの対応が必要。
以上です。