0

コードをモジュール化しようとしているので、これらのモジュールを私の多くのアプリで使用できます。各モジュールを互いに独立させようとしています。

例: 購入するオブジェクトを表示する viewController があるとします。3 つのクラスがあるとします。1 つは購入を処理するモジュール、プログレス バー クラス、もう 1 つはスピナーです。viewController にすべてインポートします。ユーザーがタップして何かを購入します。購入クラスが制御します。購入が開始されると、そのクラスはスピナーを開始する通知を発行します。購入はダウンロード可能で、進行状況バーを開始するために別の通知が発生し、進行状況バーを更新するためにいくつかの通知が発生します。販売終了。スピナーを停止して非表示にする最終通知と、進行状況バーを停止して非表示にする別の通知が発行されます。

だから、あなたは私の痛みを見ます。スピナーとプログレス バーはビュー コントローラーに追加されましたが、購入クラスは両方に通知を送信するクラスでした。そのため、購入クラス内でこれらすべての通知に使用される文字列を含む NSString を宣言するか、進行状況バーとスピナー ヘッダーを購入クラスにインポートするだけです。しかし、私が言ったように、私はすべてのクラスを独立させようとしています。常に一緒に作業する必要のないクラス間の相互作用はしたくありません。Spinner と ProgressBar は、それらを必要とする他のクラスと連携できるクラスです。PurchaseClass をそれらに結び付けたくありません。

ある時点で通知文字列を変更したい場合があり、その直接使用を追跡できなくなるため、 PurchasesClass で文字列を直接使用して通知を発行したくありません。クラスがそのクラス内でリッスンする通知のすべての宣言を作成する方法が必要であり、クラスを使用する前に他のクラスにそれを知ってもらいたいです。

すべてのクラスが事前に使用するすべての通知を登録し、それを NSUserDefaults に保存する中心的なシングルトンを考えたので、すべてのクラスは他のクラスからヘッダーをインポートすることなく NSUserDefaults から読み取ることができます。

ここで使用できる他のオプションは何ですか?

ありがとう。

4

2 に答える 2

1

通知を使用する代わりに、ブロックを使用します。購入クラスで次のようなことを試してください。

typedef void(^PurchaseManagerBlock) ();

@class ProgressBar, Spinner;

@interface PurchaseManager : NSObject

@property(nonatomic, strong) ProgressBar *progressBar;
@property(nonatomic, strong) Spinner *spinner;
@property(nonatomic, strong) PurchaseManagerBlock startBlock;
@property(nonatomic, strong) PurchaseManagerBlock completionBlock;

@implementation PurchaseManager

-(void)doSomething
{
    self.startBlock();
    //start some asynchronous task
}

-(void)finishSomething
{
   //asynchronous task finished
   self.completionBlock();
}
@end

次に、View Controller で、次のようなことができます。

purchaseManager.progressBar = self.progressBar;
purchaseManager.spinner = self.spinner;    
purchaseManager.startBlock = ^{
    progressBar.startProgress;
    spinner.startSpinning;
};

purchaseManager.completionBlock = ^{
    progressBar.stopProgress;
    spinner.stopSpinning;
}
于 2013-10-29T16:35:35.877 に答える