2011-12-27 3 views
0

私はサーバからデータをダウンロードできるモデルを持っているので、アクティビティインジケータを(ステータスバーと画面の両方に)表示する必要があります。モデルとコントローラの両方で表示する必要がある場合、アクティビティの表示を担当するクラスはどれですか?

しかし、リモートリンクをダウンロードする必要がある場合は、アクティビティインジケータを再度表示する必要がある場合は、コンテンツを表示しているコンテンツ、リンクしているもの、ローカルなもの、リモートのものもあります。

これを達成するためのデザインオプションは何ですか?

アプリケーションデリゲートには、モデルとコントローラの指示に従ってアクティビティインジケータを開始および停止するメソッドがあります。しかし、どういうわけか、これは私にとってはきれいには思えません。アプリのデリゲートを雑多な機能をダンプするバケツとして使い始めることです。

私はモデルがそれ自身の活動表示を扱うべきだと思っています。コントローラーは自分自身で対処する必要があります。しかし、もし私がそれをしたら、モデルがいくつかのUI関連のものを(最小限であっても)やっている状況はないだろうか?

清潔な推奨ソリューションはありますか?

+0

正しく設計されたモデルでは、UIコンポーネントにアクセスする必要はありません。 – Till

+0

OPには良い点があります。 'UIApplication'のインスタンス上の' BOOL'を本当に直接のUI操作と見なしていますか?これは、ステータスバーのUIを処理しているアプリケーションオブジェクトです... –

答えて

0

IMO、アクティビティインジケータは、特定のビューとは独立したビューコンポーネントなので、アプリケーションデリゲートによって管理される必要があります。

私が取り組んだのは、ActivityManagerクラスを作成し、アプリケーションデリゲートでインスタンスを作成してインスタンス化することです。それはUIWindowのインスタンスを取るので、インジケータを適切に配置して表示する方法を決定できます。アプリケーションの他のすべての領域は、このクラスとオブザーバのパターンでやり取りします。ネットワーク状態が変更され、アクティビティマネージャがアプリケーションの全体的な状態を評価してインジケータを表示または非表示にする必要があるかどうかを確認するときに通知を送信します。ここでは、私のアプリで見るかもしれないもののサンプルです:

ActivityManager *activityManager = [[ActivityManager alloc] initWithWindow:self.window]; 

self.activityManager = activityManager; 

[activityManager release]; 

[self.activityManager addNotification:kNetworkStatusDidChangeNotification]; 

[self.activityManager addAsyncActivity:[HttpManager defaultManager]]; 

[self.activityManager startObserving]; 

私は管理者がこれらの通知が発生する必要があるものを評価することができている観察したときに、そのようにして新しい通知を追加する機能を追加しました。 AsyncActivityはシングルトンのプロトコルで、データを処理しているかどうかを確認できます。それから私はマネージャーに観察を開始するよう伝えます。私がアプリを閉じるときには、単にオブザーバーをすべて外してメモリを解放するだけでいいです。

[self.activityManager stopObserving]; 

それはあなたが正しい方向に着手するようにするはずです。私はそれを行うための他の方法があると確信していますが、それは私にそれを処理する最も侵略的な方法のように思えます。それはまた非常に移植性があります。

0

複数のネットワークイベントが同時に発生している可能性があるため、すべてのアクティビティを正確に報告する必要があるようです。おそらく、ネットワーク操作を追跡し、UIApplicationのインスタンスと通信する責任を負う独立したクラスが順番に並んでいます。

単純なカウンタを使用してネットワーク操作の数を追跡するオブジェクトを想像してください。イベントを追加するとカウンタがインクリメントされ、カウンタを削除するとカウンタが減少します。カウンターが> 0の間、スピナーが見えます。これは、アプリケーションとモデルレイヤーの間の通信をカプセル化するための合理的なアプローチである可能性があります。

関連する問題