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月

Source: https://habr.com/ru/post/J91909/


All Articles