多くのモバイルアプリケーションは、サーバーからのユーザーコンテンツを表示し、このコンテンツはオンラインとオフラインで表示できます。 オンラインでの作業は簡単です。特定のUIイベントが発生すると、アプリケーションはネットワークからデータを読み取り、ユーザーに表示します。 オフラインでの作業はさらに興味深いものになります-地下鉄などでドキュメントを操作する機能 ただし、ネットワーク外での作業には問題もあります。データを同期する必要があり、このプロセスでユーザーインターフェイスがブロックされることはありません。
ソースコードの要素
-ネットワークリソースへのアクセス
-XML処理
-ファイルシステムへのアクセス
-スレッドを操作する
アプリケーション要件
アプリケーションは、サーバーからのテキストファイルをオフラインモードで表示する必要があります。 開始するたびに、同期が行われます。 同時に、更新プロセスは、ユーザーのインターフェースでの作業をブロックすべきではありません。 更新プロセス自体は2つのステップで構成されます。
1.サーバーからファイルのリストを読み取る
2.不足しているファイルをダウンロードする
コード設計
プロセス全体を管理するために、Updatersオブジェクトを管理するUpdateManagerクラスを作成します。 現時点では、2つの「アップデーター」が必要です。1つはファイルのリストを読み取るため、もう1つはファイルを操作するためです。 私たちはそれらのために単一のファサードを定義し、将来的にシステムを拡張します。 このファサードには少なくとも1つのメソッドがあります-start-各UpdaterのUpdateManagerによって順番に呼び出されます。
事前に、非同期接続を使用してネットワークにアクセスすることを知っています。 これにより、各アップデーターの完了後にUpdateManagerの作業を明確に続行する必要があります。
2つのプロトコルを宣言します。
@protocol UpdateManagerProtocol-(void)next;
終わり@protocol UpdaterProtocol-(void)startUpdate:(id)manager;
終わりUpdateManagerProtocolは、各アップデーターの完了時に呼び出される1つのメソッドを宣言します。
クラスは次のようになります。
すべてのアップデーターの動作は同じです:
XMLListUpdaterは次の手順を実行します。
1.サーバーからバッファにxmlファイルを読み取ります
2. xmlを解析します
3.各ファイルをキューに追加します。
FileUpdaterは次の手順を実行します。
1.キューから次のファイルを取得します
2.ファイルがディスク上にすでに存在するかどうかを確認します
3.ファイルをダウンロードする
4.キューが空でない場合、プロセスを繰り返します。
ソースコード
最初に、スレッドに言及せずにコードを記述します。
UpdateManager.hは、プロセス全体を開始する1つの静的メソッドを宣言します。 インスタンスのコンストラクター(init)で、すべてのアップデーターが作成され、キューに追加され、次々に呼び出されます。
各アップデーターはネットワークからデータを読み取るため、一般的なコードは別のクラスNetworkClientに移動できます。 UpdaterProtocolと非同期接続を開始するメソッド(startNetworkCall)を実装します。
最初のアップデーターはXMLFileUpdaterです。 起動時に、既知のアドレスからxmlをメモリに読み込みます。 完了すると、XMLListUpdaterはデータ処理用のxmlパーサーを作成します。 リストの各ファイルは、次のアップデーターによる処理のためにキューに追加されます。
FilesUpdaterコンテンツを更新する2番目のステップは、キューを読み取って、不足している各ファイルをダウンロードすることです。
これで、メインビューを読み込むときにUpdateManagerプロセスを開始できるようになり、アプリケーションがコンテンツを同期します。
ビューには、アクションなしのボタンが1つだけ含まれています。 コンテンツを更新すると、インターフェースがブロックされ、ボタンをクリックするとこれが表示されます。 後で、新しいスレッドを追加してブロッキングを取り除きます。
別のストリームを追加する
データを操作するためのすべてのコードがすでにあるため、別のスレッドを開始して更新する必要があります。
UpdateManagerに新しいメソッドstartInThreadを追加します。 簡単な手順で:
1. NSAutoReleasePoolを作成します
2.更新プロセスを開始します
3. RunLoopを実行する
4.プールを解放する
NSAutoReleaseは、自動メモリ管理のために、新しいスレッドごとに作成する必要があります。 そうしないと、コンソールで多くのエラーが発生します。
RunLoopはより興味深いものです。 RunLoopをコメントアウトしてアプリケーションを起動すると、ネットワーク接続の開始に関するメッセージが表示されますが、ネットワークからのデータの受信、接続の終了などのその他のイベントは発生しません。 問題は、スレッドの早期終了です。これは、「startInThread」メソッドを終了すると終了します。 したがって、スレッドがアクティブのままになるようにRunLoopを実行します。
これで、UpdateManagerの初期化をmain.mに移動できます。
ソースコードノート
UpdateManager.hには、コンパイルディレクティブ-WORK_IN_SEPARATE_THREADが含まれています。 ゼロに設定されている場合、新しいスレッドは作成されず、UIはブロックされます。 ある場合、更新は別のスレッドで行われます
プロジェクトソース:
SF.netアンドリュー・ロマネンコ
andrew@romanenco.com
2010年4月