嗨,我正在从 API 请求一个 json 对象。我正在使用信号槽来读取回复,然后将回复转换为 json 对象。直到这里一切都好
但是当我想给出输出时出现问题,我正在使用类成员来提供输出,但类成员稍后会得到更新,函数返回类成员初始值。
我的问题是如何确保该值在返回之前已更新。 我已经尝试过QTimer,但没有解决问题。
qint64 RestApiFetcher::totalSize()
{
request->setUrl(m_ipaddr + "?$count=true" + m_strtop);
IgnoreSSLCertification();
mNetReply = mNetManager->get(*request);
connect(mNetReply,&QIODevice::readyRead,this,&RestApiFetcher::dataReadSize);
connect(mNetReply,&QNetworkReply::finished,this,&RestApiFetcher::dataReadSizeFinished);
qDebug() << m_totalSize;
return m_totalSize;
}
void RestApiFetcher::dataReadSizeFinished()
{
if( mNetReply->error()){
qDebug() << "There was some error : " << mNetReply->errorString();
}else{
QJsonDocument doc = QJsonDocument::fromJson(*mDataBuffer);
QJsonObject data = doc.object();
m_totalSize = data["count"].toInt();
}
qDebug() << "#############";
qDebug() << m_totalSize;
}
输出为
0
#############
150
我需要的是
#############
150
150
基本上插槽应该首先运行,然后函数应该给出输出。
更新
qint64 RestApiFetcher::totalSize()
{
request->setUrl(m_ipaddr + "?$count=true" + m_strtop);
IgnoreSSLCertification();
mNetReply = mNetManager->get(*request);
QEventLoop loop;
connect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
loop.exec(); // waits until `quit` called from signal above
disconnect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
dataReadSizeFinished();
qDebug() << m_totalSize;
return m_totalSize;
}
输出为
#############
0
0
一个可能的解决方案是使用QEventLoop
来等待finished
发生。如果我需要在继续之前等待网络通信,这就是我所做的。这将消除对dataReadSizeFinished
的需求,然后可以将其组合到您的totalSize
函数中,或者仅使用对该函数的简单调用而不是通过信号。
qint64 RestApiFetcher::totalSize()
{
request->setUrl(m_ipaddr + "?$count=true" + m_strtop);
IgnoreSSLCertification();
QEventLoop loop;
connect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
mNetReply = mNetManager->get(*request);
loop.exec(); // waits until `quit` called from signal above
disconnect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
dataReadSize();
dataReadSizeFinished();
qDebug() << m_totalSize;
return m_totalSize;
}