Pendahuluan
Sayangnya, bahkan sekarang, di dunia modern, tidak selalu mungkin untuk mengambil keuntungan dari manfaat 
teknologi push dan kadang-kadang perlu untuk menerapkan solusi, misalnya, dalam bentuk Long Poll, yang memungkinkan Anda untuk meniru mekanisme pemberitahuan push. Secara khusus, kebutuhan seperti itu muncul ketika menerapkan 
klien VKontakte untuk Sailfish OS .
Artikel ini tidak akan membahas prinsip-prinsip interaksi dengan server Long Poll VKontakte - ini memiliki 
dokumentasi yang sangat terperinci, dan contoh-contoh dasar telah dipublikasikan 
sebelumnya . Sebaliknya, implementasi praktis untuk platform tertentu akan dipertimbangkan.
Dapat dipahami bahwa pembaca tidak asing dengan pengembangan OS Sailfish tidak hanya di 
QML , tetapi juga di 
C ++ .
Pelanggan Polling Panjang
Kelas klien utama adalah kelas 
LongPoll , yang menanyakan server Long Poll dan mem-parsing responsnya.
Metode 
getLongPollServer , yang tugasnya memperoleh informasi untuk membuka koneksi ke server, dipanggil selama inisialisasi aplikasi, yang memungkinkan Anda untuk segera menerima pembaruan pengguna:
  void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer");  
Jika permintaan berhasil diselesaikan, informasi koneksi dengan server Long Poll disimpan dan koneksi dibuka menggunakan metode 
doLongPollRequest :
  void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());  
Dalam metode Polling Panjang 
doLongPollRequest , parameter koneksi yang diperlukan diteruskan ke server:
  void LongPoll::doLongPollRequest() { QUrl url("https://" + _server);  
Perlu dicatat bahwa nilai bidang 
mode , sama dengan 10, diperoleh dengan menambahkan opsi untuk menerima lampiran (2) dan mengembalikan rangkaian acara yang diperpanjang (8).
Sebagai tanggapan untuk membuka koneksi, server mengembalikan JSON yang berisi peristiwa terbaru. Respons diproses dalam metode 
finished :
  void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll());  
Bidang yang 
failed dalam respons dapat mengambil empat nilai, tetapi hanya satu dari mereka, sama dengan satu, tidak memerlukan permintaan berulang untuk informasi untuk terhubung ke server Long Poll. Untuk alasan ini, kondisi ditambahkan ke kode.
 jObj.value("failed").toInt() == 1 
Metode 
parseLongPollUpdates adalah siklus sederhana untuk semua acara yang masuk dengan centang jenisnya:
 enum LONGPOLL_EVENTS { NEW_MESSAGE = 4,  
Kode menunjukkan bahwa untuk setiap acara Long Poll baru, klien mengirim 
sinyal yang harus diproses oleh bagian lain dari aplikasi. Argumen sinyal bukan objek acara keseluruhan, tetapi hanya bagian yang diperlukan. Misalnya, sinyal 
gotNewMessage hanya mentransmisikan pengidentifikasi pesan baru, yang dengannya konten lengkapnya 
diminta :
 void VkSDK::_gotNewMessage(int id) { _messages->getById(id); } 
Sebagai hasil dari fungsi single-line ini 
, permintaan dibuat ke server VKontakte untuk mendapatkan informasi lengkap tentang pesan oleh pengidentifikasi dengan 
penciptaan lebih lanjut 
dari objek pesan ini. Sebagai kesimpulan, sebuah sinyal dikirim terkait dengan antarmuka pengguna, mentransmisikan data tentang pesan baru, yang 
ditampilkan di panel notifikasi:
 import QtQuick 2.0  
Antarmuka dialog
Sekarang, berdasarkan prinsip-prinsip interaksi klien dengan server Long Poll dan prinsip-prinsip mentransfer informasi yang diterima ke antarmuka pengguna, kita dapat mempertimbangkan contoh memperbarui 
dialog terbuka.
Hal pertama yang menarik perhatian Anda adalah komponen 
Connections :
 Connections {  
Slot 
onUserTyping memproses peristiwa yang diatur oleh lawan bicara pesan dengan menampilkan notifikasi yang sesuai kepada pengguna. Di sini, pada langkah pertama, pengidentifikasi ruangan diperoleh (ruangan berarti istilah umum untuk dialog dan obrolan), dan pada tahap kedua, pemberitahuan ditampilkan jika pengidentifikasi yang diterima dan pengidentifikasi dari pencocokan kamar saat ini.
Perlu dicatat bahwa pemberitahuan tentang sekumpulan pesan ditampilkan selama sepuluh detik, jika selama waktu ini belum ada acara baru yang mengaktifkan kembali pemberitahuan tersebut. Ini dicapai dengan menggunakan komponen 
Timer :
 Label {  
Slot 
onSavedPhoto bertanggung jawab untuk memproses akhir pemuatan gambar dalam pesan, yang berada di luar cakupan artikel saat ini.
Hal kedua yang menarik adalah daftar pesan:
 SilicaListView {  
Di sini, komponen 
MessageItem bertanggung jawab untuk menampilkan satu pesan. Pertimbangannya berada di luar cakupan artikel ini.
Pesan itu sendiri diambil dari model 
vksdk.messagesModel . Model ini adalah daftar objek 
Message yang dapat diperbarui secara waktu nyata menggunakan metode 
add , 
prepend , 
addProfile , 
readMessages , dan 
clear :
  void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size());  
Umum untuk semua lima metode adalah penggunaan sinyal 
dataChanged , yang menunjukkan bahwa data telah diperbarui dalam model. 
SilicaListView sinyal ini memperbarui elemen 
SilicaListView untuk menampilkan status pesan saat ini. Menambahkan pesan ke 
SilicaListView disediakan dengan memanggil 
endInsertRows rowsAboutToBeInserted dan 
rowsInserted masing-masing mengirim 
rowsAboutToBeInserted dan 
rowsInserted . Akibatnya, pengguna akan melihat pesan baru dan statusnya secara real time dalam dialog.
Kesimpulan
Artikel ini meneliti interaksi dengan server Long Poll ketika mengembangkan untuk Sailfish OS menggunakan aplikasi VK sebagai contoh. Beberapa fitur dari implementasi klien dan cara untuk memperbarui antarmuka pengguna secara real time dipertimbangkan. Kode untuk aplikasi yang dijelaskan dalam artikel ini 
tersedia di GitHub.