Einführung
Leider ist es in der modernen Welt selbst jetzt nicht immer möglich, die Vorteile 
der Push-Technologie zu nutzen, und manchmal müssen Sie Problemumgehungen implementieren, beispielsweise in Form von Long Poll, mit denen Sie den Mechanismus von Push-Benachrichtigungen emulieren können. Ein solcher Bedarf trat insbesondere bei der Implementierung 
des VKontakte-Clients für Sailfish OS auf .
In diesem Artikel werden die Prinzipien der Interaktion mit dem Long Poll VKontakte-Server nicht erläutert. Er enthält eine sehr detaillierte 
Dokumentation , und grundlegende Beispiele wurden bereits früher veröffentlicht. Stattdessen wird eine praktische Implementierung für eine bestimmte Plattform in Betracht gezogen.
Es versteht sich, dass der Leser mit der Entwicklung von Sailfish OS nicht nur in 
QML , sondern auch in 
C ++ vertraut ist.
Long Poll Kunde
Die Hauptclientklasse ist die 
LongPoll Klasse, die den Long Poll-Server abfragt und seine Antworten analysiert.
Die Methode 
getLongPollServer , deren Aufgabe es ist, Informationen zum 
getLongPollServer einer Verbindung zum Server 
getLongPollServer , wird während der Anwendungsinitialisierung aufgerufen, 
getLongPollServer Sie sofort Benutzeraktualisierungen erhalten können:
  void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");  
Wenn die Anforderung erfolgreich abgeschlossen wurde, werden die Verbindungsinformationen mit dem Long Poll-Server gespeichert und die Verbindung mit der Methode 
doLongPollRequest geöffnet:
  void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());  
In der Methode 
doLongPollRequest Long Poll werden die erforderlichen Verbindungsparameter an den Server übergeben:
  void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);  
Es ist anzumerken, dass der Wert des 
mode gleich 10 erhalten wurde, indem die Option zum Empfangen von Anhängen (2) hinzugefügt und eine erweiterte Reihe von Ereignissen (8) zurückgegeben wurde.
Als Antwort auf das Öffnen einer Verbindung gibt der Server einen JSON zurück, der die neuesten Ereignisse enthält. Die Antwort wird in der 
finished Methode verarbeitet:
  void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());  
Das 
failed Feld in der Antwort kann vier Werte annehmen, aber nur einer von ihnen, der einem entspricht, erfordert keine wiederholte Anforderung von Informationen, um eine Verbindung zum Long Poll-Server herzustellen. Aus diesem Grund wurde die Bedingung zum Code hinzugefügt.
 jObj.value("failed").toInt() == 1 
Die 
parseLongPollUpdates Methode ist ein einfacher Zyklus für alle eingehenden Ereignisse mit einer Überprüfung ihres Typs:
 enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,  
Der Code zeigt, dass der Client für jedes neue Long Poll-Ereignis ein 
Signal sendet, das von einem anderen Teil der Anwendung verarbeitet werden muss. Das Signalargument ist nicht das gesamte Ereignisobjekt, sondern nur die erforderlichen Teile. Beispielsweise überträgt das 
gotNewMessage Signal nur die Kennung einer neuen Nachricht, von der der vollständige Inhalt 
angefordert wird :
 void VkSDK::_gotNewMessage(int id) { _messages->getById(id); } 
Als Ergebnis dieser einzeiligen Funktion 
wird eine Anforderung an den VKontakte-Server gesendet, um vollständige Informationen über die Nachricht durch ihre Kennung zu erhalten, wobei 
das Objekt dieser Nachricht weiter erstellt wird. Abschließend wird ein der Benutzeroberfläche zugeordnetes Signal gesendet, das Daten zu einer neuen Nachricht überträgt, die im Benachrichtigungsfeld 
angezeigt wird :
 import QtQuick 2.0  
Dialogoberfläche
Basierend auf den Prinzipien der Client-Interaktion mit dem Long Poll-Server und den Prinzipien der Übertragung der empfangenen Informationen auf die Benutzeroberfläche können wir nun ein Beispiel für die Aktualisierung eines offenen 
Dialogs betrachten .
Das erste, was auffällt, ist die 
Connections Komponente:
 Connections {  
Der 
onUserTyping Slot verarbeitet das Ereignis eines Satzes, den der Gesprächspartner der Nachricht festgelegt hat, indem er dem Benutzer die entsprechende Benachrichtigung anzeigt. Hier wird im ersten Schritt die Raumkennung erhalten (der Raum bedeutet den allgemeinen Begriff für Dialoge und Chats), und in der zweiten Stufe wird eine Benachrichtigung angezeigt, wenn die empfangene Kennung und die Kennung der aktuellen Raumkennung übereinstimmen.
Es ist zu beachten, dass eine Benachrichtigung über eine Reihe von Nachrichten zehn Sekunden lang angezeigt wird, wenn während dieser Zeit kein neues Ereignis aufgetreten ist, das die Benachrichtigung erneut aktiviert. Dies wird mit der 
Timer Komponente erreicht:
 Label {  
Der 
onSavedPhoto Slot 
onSavedPhoto für die Verarbeitung des Endes des 
onSavedPhoto in Nachrichten verantwortlich, was den Rahmen des aktuellen Artikels 
onSavedPhoto .
Das zweite, was von Interesse ist, ist die Nachrichtenliste:
 SilicaListView {  
Hier ist die 
MessageItem Komponente für die Anzeige einer einzelnen Nachricht verantwortlich. Ihre Berücksichtigung würde den Rahmen dieses Artikels sprengen.
Die Nachrichten selbst stammen aus dem Modell 
vksdk.messagesModel . Dieses Modell ist eine Liste von 
Message , die in Echtzeit mithilfe der Methoden 
addProfile , 
readMessages , 
addProfile , 
readMessages und 
clear aktualisiert werden können:
  void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());  
Allen fünf Methoden gemeinsam ist die Verwendung des 
dataChanged Signals, das angibt, dass die Daten im Modell aktualisiert wurden. Durch das 
SilicaListView dieses Signals werden die 
SilicaListView Elemente aktualisiert, um den aktuellen Status von Nachrichten anzuzeigen. Das Hinzufügen von Nachrichten zu 
SilicaListView erfolgt durch Aufrufen der 
endInsertRows beginInsertRows und 
endInsertRows , die die 
rowsInserted beginInsertRows bzw. 
endInsertRows senden. Infolgedessen sieht der Benutzer in Echtzeit neue Nachrichten und deren Status im Dialogfeld.
Fazit
In diesem Artikel wurde die Interaktion mit dem Long Poll-Server bei der Entwicklung für Sailfish OS am Beispiel der VK-Anwendung untersucht. Einige Funktionen der Client-Implementierung und eine Möglichkeit zum Aktualisieren der Benutzeroberfläche in Echtzeit wurden berücksichtigt. Der Code für die in diesem Artikel beschriebene Anwendung ist auf GitHub 
verfügbar .