如何模块化监听通知的类?

时间:2013-10-29 16:18:27

标签: ios cocoa-touch

我正在尝试模块化我的代码,所以我可以在我的许多应用程序中使用这些模块。我试图让每个模块彼此独立。

例如:假设我有一个viewController,显示要购买的对象。假设我有3个类,一个是处理购买的模块,一个进度条类,另一个是微调器。我在viewController上导入了所有内容。用户点击购买东西。购买类获得控制权。购买开始时,该类会触发通知以启动微调器。可以下载购买,触发另一个通知以启动进度条,并触发几个通知来更新进度条。销售完成。触发最终通知以停止和隐藏微调器以及另一个停止和隐藏进度条的通知。

所以,你看到了我的痛苦。微调器和进度条被添加到视图控制器中,但是购买类是向两者发送通知的类。因此,我必须在购买类中声明包含用于所有这些通知的字符串的NSString,或者只需将进度条和微调器标题导入到购买类中。但是,正如我所说,我试图使所有课程独立。我不希望在不必一直工作的类之间进行交互。 Spinner和ProgressBar是可以与需要它们的任何其他类一起使用的类。我不想将PurchaseClass绑定到它们。

我不想直接在PurchasesClass上使用字符串触发通知,因为我可能想要在某个时候更改通知字符串,并且将无法跟踪该直接使用。我想要一种方法来创建类在该类中侦听的通知的所有声明,并且我希望其他类在使用该类之前了解它。

我想到了一个中心单例来注册所有类将提前使用的所有通知并将其保存到NSUserDefaults,因此每个类都可以从NSUserDefaults读取而无需从其他类导入标头。

我在这里可以使用哪些其他选项?

感谢。

2 个答案:

答案 0 :(得分: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

然后在视图控制器中,您可以执行以下操作:

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

purchaseManager.completionBlock = ^{
    progressBar.stopProgress;
    spinner.stopSpinning;
}

答案 1 :(得分:1)

在你的模型中,视图控制器,它......控制视图。视图控制器是中央调度程序,它应该从采购类接收通知并更新视图(微调器,进度条)。这就是视图控制器在Apple的MVC中所做的事情。

购买类在其标头中声明通知常量字符串。此设计在iOS SDK中使用。