Здравствуйте.
Имеется типичная ситуация:
Из пользовательских данных, оформленных в виде Request,
необходимо сформировать url-запрос, а по пришествии ответа,
обработать его в зависимости от самого Request.
Во многих проектах связь между запросом и ответом устанавливается
посредством QHash, т.е. имеется нечто подобное:
QNetworkReply Driver::send(Request* request) {
QUrl url = request->createUrlRequest();
QNetworkReply reply = networkaccessmanager->get( url );
requestDataHash.insert ( reply, request );
}
Response Driver::finished(QNetworkReply* reply) {
Request* request = requestDataHash.value( &reply );
requestDataHash.remove ( &reply );
QByteArray replyData = reply->readAll();
return this->process( replyData , request )
}
Это просто пример, поэтому утечка памяти не в счёт.
Насколько в этом случае целесообразно использовать QHash?
Можно ли обойтись классом контейнером, который хранит Request*
и ловит сигнал finished от конкретного reply:
QNetworkReply Driver::send(Request* request) {
QUrl url = request->createUrlRequest();
Container* container = new Container(request, this);
QNetworkReply reply = networkaccessmanager->get( url );
connect(reply, SIGNAL(finished()), container, SLOT(finished());
requestDataHash.insert ( reply, request );
}
Container::Container(Request* request, Driver* driver) {
this->request = request;
this->driver = driver;
}
Container::finished(Request* request, Driver* driver) {
QByteArray replyData = sender()->readAll();
driver->process( replyData , request );
sender()->deleteLater();
}
Здесь можно было ещё ответ от Container оформить в виде сигнала Driver.
Чем черевата такая обёртка, кроме как передачей Driver по указателю?
Если за сеанс посылаются тысячи запросов, то в первом случае возникает
необоснованная нагрузка на QHash. Возможно, что QSignalMapper позволяет
проще разрулить сигналы и слоты, но надо смотреть в код, на чём он основан.
В реальности не хватает только некоего механизма, где у слота имеется предопределённый параметр:
connect(reply,SIGNAL(finished()),this, SLOT(process(request)));
Буду признателен за обоснованный ответ.