アプリデリゲートのすべてのクラスからアクセスできるようにしたい変数を格納し、それらを経由して取得するのは悪い習慣ですか?[[UIApplication sharedApplication] delegate] someProperty]
2 に答える
あなたの質問に対する本当の解決策は、ある形式のグローバル状態を別の形式 (つまり、シングルトン) に置き換えることではありません。
あなたがしなければならないことは、アプリデリゲート内でインスタンス化された「モデル」クラス内に状態を置き、それらを必要とするアプリケーションの部分 (ビューコントローラーなど) に渡すことで、グローバル状態の問題を完全に排除します。
このように AppDelegate をアプリ全体の変数のコンテナーとしてロードすることは、通常はお勧めできません。すぐに扱いにくくなります。
一般的な方法は、次のようにいくつかのシングルトン オブジェクトを定義することです。
+ (instancetype)shared
{
static dispatch_once_t onceToken;
static MyServiceClient* instance;
dispatch_once(&onceToken, ^ //Use GCD to make a singleton with thread-safety
{
instance = [[self alloc] init];
});
return instance;
}
次に、これらのオブジェクトをコラボレーターとして必要とするクラスにパラメーターとして提供できます。
依存性注入を使用する
ただし、シングルトンはアンチパターンと見なすことができることに注意してください。これらのシングルトンをそれらを必要とするクラスに挿入する場合、それほど悪くはありませんが、それらをハードワイヤすることは絶対にお勧めできません (残念ながら、これも一般的な方法です)。単体テスト。
もう 1 つのアプローチは、依存性注入を使用することです。この場合、ほとんどの場合、オブジェクトはシングルトンである必要さえありません。必要に応じて出入りする特定のユース ケースのコラボレーション コンポーネントのオブジェクト グラフをインスタンス化できます。これには、リソースに制約のあるデバイスで使用するメモリが少なくなるという利点があります。
依存性注入を使用するにはライブラリが必要だというよくある誤解です。あなたはそうしない。それはしかし助けることができます。Typhoonという依存性注入コンテナーを作成しました。
通知
クラス間の緩やかなコラボレーションを実現するもう 1 つの方法は、notificationsを使用することです。