iPhoneアプリケーションコンテンツの更新

多くのモバイルアプリケーションは、サーバーからのユーザーコンテンツを表示し、このコンテンツはオンラインとオフラインで表示できます。 オンラインでの作業は簡単です。特定の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月



All Articles