0

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

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

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

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

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

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

谢谢。

4

2 回答 2

1

在您的模型中,视图控制器,嗯……它控制视图。视图控制器是中央调度器,它应该接收来自购买类的通知并更新视图(微调器、进度条)。这就是视图控制器在 Apple 的 MVC 中所做的事情。

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

于 2013-10-29T18:56:15.883 回答
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;
}
于 2013-10-29T16:35:35.877 回答