QNetworkAccessManager подключен к 2 слотам ответа, как мне узнать, какой ответ принадлежит какому запросу

В моем приложении 1 QNetworkAccessManager, и я делаю 2 запроса одновременно. Когда я получаю ответ от менеджера, ответы идут не в том порядке, в котором я им звонил, и это имеет смысл. Как я могу это обойти? Должен ли я иметь другого менеджера для устранения любых проблем с очередями запросов?

QNetworkRequest request1(ONE_GET);
request1.setRawHeader("Content-Type", "application/vnd.api+json");
request1.setRawHeader("Accept", "application/vnd.api+json");  
m_nam.get(request1);

connect(&m_nam, &QNetworkAccessManager::finished,this , &HelperClass::onReply1Recieved);

QNetworkRequest request2(TWO_GET);
request2.setRawHeader("Content-Type", "application/vnd.api+json");
request2.setRawHeader("Accept", "application/vnd.api+json");

m_nam.get(request2);

connect(&m_nam, &QNetworkAccessManager::finished,this , &HelperClass::onReply2Recieved);

person bardao    schedule 06.11.2018    source источник
comment
это другой слот   -  person bardao    schedule 06.11.2018
comment
хорошо, извините. Вы хотите, чтобы вторая петиция началась, когда закончится первая?   -  person eyllanesc    schedule 06.11.2018
comment
Я могу справиться с этим, сигнализируя первому, чтобы он быстро отключился от второго внутри onReply1REceived(), но я думал, что это не чисто   -  person bardao    schedule 06.11.2018
comment
Вы не ответили мне, насколько я понимаю, вы хотите начать первый запрос, когда вы закончите первый запрос, вы просто хотите, чтобы его называли вторым запросом, то есть они в очереди, я прав?   -  person eyllanesc    schedule 06.11.2018
comment
Я просто попробовал это (вызывая 2, когда заканчивается 1), и это фактически решило проблему, с которой я столкнулся с данными JSON, не входящими в ответ, мне интересно, почему хммм   -  person bardao    schedule 06.11.2018
comment
Я хотел запросить оба и прочитать данные по мере их поступления, но, видимо, это создает проблемы.   -  person bardao    schedule 06.11.2018
comment
Я проверю, я отключал сигнал в начале каждого ответа, хотя   -  person bardao    schedule 06.11.2018


Ответы (1)


Проблема в вашем случае заключается в том, что оба слота подключаются к одному и тому же сигналу, поэтому оба будут уведомлены, и даже если вы попытаетесь отключить сигнал, который не гарантирует, что он работает правильно, решение состоит в том, чтобы подключить сигнал каждого из QNetworkReply :

QNetworkRequest request1(ONE_GET);
request1.setRawHeader("Content-Type", "application/vnd.api+json");
request1.setRawHeader("Accept", "application/vnd.api+json");  
QNetworkReply *reply1 = m_nam.get(request1);
connect(reply1, &QNetworkReply::finished, this, &HelperClass::onReply1Recieved);


QNetworkRequest request2(TWO_GET);
request2.setRawHeader("Content-Type", "application/vnd.api+json");
request2.setRawHeader("Accept", "application/vnd.api+json");
QNetworkReply *reply2 = m_nam.get(request2);
connect(reply2, &QNetworkReply::finished, this, &HelperClass::onReply2Recieved);

void HelperClass::onReply1Recieved(){
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    qDebug() << reply->readAll();
}

void HelperClass::onReply2Recieved(){
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    qDebug() << reply->readAll();
}
person eyllanesc    schedule 06.11.2018
comment
отлично! ответы уникальны, поэтому сигналы вызываются индивидуально. имеет смысл. Спасибо! - person bardao; 06.11.2018