web-dev-qa-db-ja.com

アプリケーションデリゲートのiPhoneの適切な使用

アプリケーションのどこからでも特定の状態/オブジェクトを参照できるようにしたいと考えています。たとえば、ユーザーがアプリケーションにログインした場合、Webサービスを呼び出してユーザー情報を取得する必要があります。次に、次のようなものを使用して、アプリケーションのどこからでもこの情報にアクセスできるようにします。

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
user = delegate.u;

インスタンスデリゲートをアプリデリゲートのユーザーオブジェクトとして設定し、必要なときにそこからそれを参照するのは貧弱な方法ですか?通常、ユーザーのログイン時に設定します。

プロがこれをどのように処理するかを聞きたかった。

58
Coocoo4Cocoa

通常、次の場合にのみアプリデリゲートに接続する必要があります。

  • アプリデリゲートと同じNIBファイルから作成されました(つまり、単一ウィンドウインターフェイスの静的UI要素)
  • アプリデリゲートを通過するアプリケーションレベルのイベント処理に関連付けられています(Preferencesウィンドウのメニュー項目など)

それ以外の場合は、それらへのアクセスを管理するシングルトンを作成する必要があります。

Jason Cocoは、アプリケーションコントローラーを介したルーティングを提案しました。私のプログラムでは、トップレベルでの責任が大きすぎると思うので、私は通常これを避けます-可能な場合は物事を自己管理するべきだと思います。レベルモジュール。

私は自分のブログをリンクするつもりはありませんが、もしあなたが私とシングルトンをグーグルで検索するなら、おそらく私が書いた投稿をより詳細に見つけるでしょう。

52
Matt Gallagher

マットは少し控えめです。この件に関する彼の投稿は、私が読んだ中で最高のものの1つであり、リンクに値します。 http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

31

あなたのアプローチに問題はないと思います。私は通常、この状況を処理するためにシングルトンを使用します。

// MyCommon.h:
@interface MyCommon
class MyCommon : NSObject
{
    int user;
};

@property(assign) int user;

+ (MyCommon *)singleton;

@end

// MyCommon.m:
@implementation MyCommon

static MyCommon * MyCommon_Singleton = nil;

+ (MyCommon *)singleton
{
    if (nil == MyCommon_Singleton)
    {
        MyCommon_Singleton = [[MyCommon_Singleton alloc] init];
    }

    return MyCommon_Singleton;
}
@end

MyCommonシングルトンは、次のようにアプリケーション内の任意の場所で使用されます。

int user = [MyCommon singleton].user;
13
e.James

通常、アプリケーションのコントローラーにこの情報を要求し、データモデルが存在する場合はそれを保存/検索する方法を知る責任があります。アプリケーションのコントローラーは、アプリケーションのデリゲートと同じである場合とそうでない場合があります(ほとんどの単純なアプリケーションでは同じです)。

3
Jason Coco