RustでGNOMEアプリを構築する、パート6:フィードの取... ノート

RustでGNOMEアプリを構築する、パート6:フィードの取得

この記事では、ユーザーインターフェースをフリーズせずにGNOMEアプリケーションにネットワークフェッチを統合する方法について詳述します。前のステップではフィード名を表示するサイドバーが設けられましたが、フィードを選択すると表示テキストのみが更新され、内容は更新されませんでした。フィード選択信号ハンドラー内で直接ネットワークフェッチを試みる単純な解決策は、フェッチ期間中アプリケーションウィンドウ全体がフリーズします。このフリーズは、GTKのメインループが単一のスレッド上で動作しており、それをブロックするとUIの更新やレスポンシブができなくなるため発生します。核心的な問題は、GTK/GObject型がスレッド安全でないため、バックグラウンドスレッドから直接操作できないことです。このソリューションは、UIタスク用のGTKのGLibメインループと、ネットワークリクエストのようなI/Oバウンド操作用のTokioランチの2つの異なる実行者を実行することから始まります。これらのエグゼキューターは厳格に分離されており、GLibループがブロックされることはなく、TokioはGTK/GObjectタイプに直接触れないルールに従っています。両者間の通信は単一の「シーム」で行われ、GLibコンテキスト上の未来はTokioの結果を待ち、その後安全にメインコンテキストに戻って平素な数値として戻ります。これを実現するために、アプリケーションはTokioと「reqwest」依存関係を追加します。TokioランタイムはGTKアプリケーション開始前に「main」で一度だけビルドされ、そのハンドルは「GazetteApplication」構造体に格納されます。非同期の「fetch_feed」関数を含む新しい「src/fetch.rs」モジュールが作成されます。この関数はTokioランタイム内で「reqwest」を使ってRSS/Atomフィードをダウンロード・解析し、「Vec<FeedItem>」構造体を返します。この「FeedItem」は単なるRust構造体であり、GObjectではなく、スレッド安全ルールを破らずにGLibメインスレッドに安全に戻すことを保証します。